add speaker page components
This commit is contained in:
parent
d770b6f266
commit
25b5d30596
@ -1,12 +1,14 @@
|
|||||||
import { Routes, Route } from "react-router-dom";
|
import { Routes, Route } from "react-router-dom";
|
||||||
import Home from "./pages/Home";
|
import Home from "./pages/Home";
|
||||||
import Programm from "./pages/Programm";
|
import Programm from "./pages/Programm";
|
||||||
|
import Speaker from "./pages/Speaker";
|
||||||
|
|
||||||
function App() {
|
function App() {
|
||||||
return (
|
return (
|
||||||
<Routes>
|
<Routes>
|
||||||
<Route path="/" element={<Home />} />
|
<Route path="/" element={<Home />} />
|
||||||
<Route path="/programm" element={<Programm />} />
|
<Route path="/programm" element={<Programm />} />
|
||||||
|
<Route path="/speaker" element={<Speaker />} />
|
||||||
</Routes>
|
</Routes>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
BIN
relume-test/src/assets/speakers/speaker1.jpg
Normal file
BIN
relume-test/src/assets/speakers/speaker1.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 137 KiB |
BIN
relume-test/src/assets/speakers/speaker2.jpg
Normal file
BIN
relume-test/src/assets/speakers/speaker2.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 104 KiB |
BIN
relume-test/src/assets/speakers/speaker3.jpg
Normal file
BIN
relume-test/src/assets/speakers/speaker3.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 60 KiB |
BIN
relume-test/src/assets/speakers/speaker4.jpg
Normal file
BIN
relume-test/src/assets/speakers/speaker4.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 84 KiB |
171
relume-test/src/components/Team4.tsx
Normal file
171
relume-test/src/components/Team4.tsx
Normal file
@ -0,0 +1,171 @@
|
|||||||
|
import speaker1 from "../assets/speakers/speaker1.jpg";
|
||||||
|
import speaker2 from "../assets/speakers/speaker2.jpg";
|
||||||
|
import speaker3 from "../assets/speakers/speaker3.jpg";
|
||||||
|
import speaker4 from "../assets/speakers/speaker4.jpg";
|
||||||
|
import { Button } from "@relume_io/relume-ui";
|
||||||
|
import type { ButtonProps } from "@relume_io/relume-ui";
|
||||||
|
import { BiLogoDribbble, BiLogoLinkedinSquare } from "react-icons/bi";
|
||||||
|
import { FaXTwitter } from "react-icons/fa6";
|
||||||
|
|
||||||
|
type ImageProps = {
|
||||||
|
src: string;
|
||||||
|
alt?: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
type Footer = {
|
||||||
|
heading: string;
|
||||||
|
description: string;
|
||||||
|
button: ButtonProps;
|
||||||
|
};
|
||||||
|
|
||||||
|
type SocialLink = {
|
||||||
|
href: string;
|
||||||
|
icon: React.ReactNode;
|
||||||
|
};
|
||||||
|
|
||||||
|
type TeamMember = {
|
||||||
|
image: ImageProps;
|
||||||
|
name: string;
|
||||||
|
jobTitle: string;
|
||||||
|
description: string;
|
||||||
|
socialLinks: SocialLink[];
|
||||||
|
};
|
||||||
|
|
||||||
|
type Props = {
|
||||||
|
tagline: string;
|
||||||
|
heading: string;
|
||||||
|
description: string;
|
||||||
|
teamMembers: TeamMember[];
|
||||||
|
footerContent: Footer;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type Team4Props = React.ComponentPropsWithoutRef<"section"> & Partial<Props>;
|
||||||
|
|
||||||
|
export const Team4 = (props: Team4Props) => {
|
||||||
|
const { tagline, heading, description, teamMembers, footerContent } = {
|
||||||
|
...Team4Defaults,
|
||||||
|
...props,
|
||||||
|
};
|
||||||
|
return (
|
||||||
|
<section id="relume" className="px-[5%] py-16 md:py-24 lg:py-28">
|
||||||
|
<div className="container">
|
||||||
|
<div className="rb-12 mb-12 max-w-lg md:mb-18 lg:mb-20">
|
||||||
|
<p className="mb-3 font-semibold md:mb-4">{tagline}</p>
|
||||||
|
<h2 className="rb-5 mb-5 text-5xl font-bold md:mb-6 md:text-7xl lg:text-8xl">
|
||||||
|
{heading}
|
||||||
|
</h2>
|
||||||
|
<p className="md:text-md">{description}</p>
|
||||||
|
</div>
|
||||||
|
<div className="grid grid-cols-1 items-start justify-items-start gap-x-8 gap-y-12 md:grid-cols-2 md:gap-x-8 md:gap-y-16 lg:grid-cols-4">
|
||||||
|
{teamMembers.map((member, index) => (
|
||||||
|
<TeamMember key={index} member={member} />
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
<div className="mt-14 w-full max-w-md md:mt-20 lg:mt-24">
|
||||||
|
<h4 className="mb-3 text-2xl font-bold md:mb-4 md:text-3xl md:leading-[1.3] lg:text-4xl">
|
||||||
|
{footerContent.heading}
|
||||||
|
</h4>
|
||||||
|
<p className="md:text-md">{footerContent.description}</p>
|
||||||
|
<div className="mt-6 flex flex-wrap gap-4 md:mt-8">
|
||||||
|
<Button {...footerContent.button}>{footerContent.button.title}</Button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const TeamMember = ({ member }: { member: TeamMember }) => {
|
||||||
|
return (
|
||||||
|
<div className="flex flex-col">
|
||||||
|
<div className="relative mb-5 aspect-square size-full overflow-hidden md:mb-6 md:pt-[100%]">
|
||||||
|
<img
|
||||||
|
src={member.image.src}
|
||||||
|
alt={member.image.alt}
|
||||||
|
className="absolute inset-0 size-full object-cover"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div className="mb-3 md:mb-4">
|
||||||
|
<h5 className="text-md font-semibold md:text-lg">{member.name}</h5>
|
||||||
|
<h6 className="md:text-md">{member.jobTitle}</h6>
|
||||||
|
</div>
|
||||||
|
<p>{member.description}</p>
|
||||||
|
<div className="mt-6 grid grid-flow-col grid-cols-[max-content] gap-[0.875rem] self-start">
|
||||||
|
{member.socialLinks.map((link, index) => (
|
||||||
|
<a key={index} href={link.href}>
|
||||||
|
{link.icon}
|
||||||
|
</a>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export const Team4Defaults: Props = {
|
||||||
|
tagline: "",
|
||||||
|
heading: "Unsere Speaker",
|
||||||
|
description: "",
|
||||||
|
teamMembers: [
|
||||||
|
{
|
||||||
|
image: { src: speaker1, alt: "Jens Riegelsberger" },
|
||||||
|
name: "Jens Riegelsberger",
|
||||||
|
jobTitle: "UX Director · Google",
|
||||||
|
description: "Jens leitet die UX-Teams für Search und Maps sowie die globale UXR-Infrastruktur.",
|
||||||
|
socialLinks: [{ href: "#", icon: <BiLogoLinkedinSquare className="size-6" /> }],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
image: { src: speaker2, alt: "Marcus J. Low" },
|
||||||
|
name: "Marcus J. Low",
|
||||||
|
jobTitle: "Principal Designer · Airbnb",
|
||||||
|
description: "Als Mitentwickler des ersten Airbnb Design Systems spricht Marcus über die Balance zwischen Markenästhetik und funktionaler Logik.",
|
||||||
|
socialLinks: [{ href: "#", icon: <BiLogoLinkedinSquare className="size-6" /> }],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
image: { src: speaker3, alt: "Reto Gwerder" },
|
||||||
|
name: "Reto Gwerder",
|
||||||
|
jobTitle: "Head of Product · Ginetta",
|
||||||
|
description: "Reto steht für Schweizer Design-Qualität. Er analysiert, warum Simplizität oft die größte technische Herausforderung ist.",
|
||||||
|
socialLinks: [{ href: "#", icon: <BiLogoLinkedinSquare className="size-6" /> }],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
image: { src: speaker4, alt: "Dr. Elena Rossi" },
|
||||||
|
name: "Dr. Elena Rossi",
|
||||||
|
jobTitle: "Cognitive Psychologist · University of Milan",
|
||||||
|
description: "Elena verbindet Wissenschaft mit Design. Sie erklärt, wie unser Gehirn auf Micro-Interactions reagiert.",
|
||||||
|
socialLinks: [{ href: "#", icon: <BiLogoLinkedinSquare className="size-6" /> }],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
image: { src: "https://d22po4pjz3o32e.cloudfront.net/placeholder-image.svg", alt: "Dr. Elena Rossi" },
|
||||||
|
name: "Dr. Elena Rossi",
|
||||||
|
jobTitle: "Cognitive Psychologist · University of Milan",
|
||||||
|
description: "Elena verbindet Wissenschaft mit Design. Sie erklärt, wie unser Gehirn auf Micro-Interactions reagiert.",
|
||||||
|
socialLinks: [{ href: "#", icon: <BiLogoLinkedinSquare className="size-6" /> }],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
image: { src: "https://d22po4pjz3o32e.cloudfront.net/placeholder-image.svg", alt: "Dr. Elena Rossi" },
|
||||||
|
name: "Dr. Elena Rossi",
|
||||||
|
jobTitle: "Cognitive Psychologist · University of Milan",
|
||||||
|
description: "Elena verbindet Wissenschaft mit Design. Sie erklärt, wie unser Gehirn auf Micro-Interactions reagiert.",
|
||||||
|
socialLinks: [{ href: "#", icon: <BiLogoLinkedinSquare className="size-6" /> }],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
image: { src: "https://d22po4pjz3o32e.cloudfront.net/placeholder-image.svg", alt: "Dr. Elena Rossi" },
|
||||||
|
name: "Dr. Elena Rossi",
|
||||||
|
jobTitle: "Cognitive Psychologist · University of Milan",
|
||||||
|
description: "Elena verbindet Wissenschaft mit Design. Sie erklärt, wie unser Gehirn auf Micro-Interactions reagiert.",
|
||||||
|
socialLinks: [{ href: "#", icon: <BiLogoLinkedinSquare className="size-6" /> }],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
image: { src: "https://d22po4pjz3o32e.cloudfront.net/placeholder-image.svg", alt: "Dr. Elena Rossi" },
|
||||||
|
name: "Dr. Elena Rossi",
|
||||||
|
jobTitle: "Cognitive Psychologist · University of Milan",
|
||||||
|
description: "Elena verbindet Wissenschaft mit Design. Sie erklärt, wie unser Gehirn auf Micro-Interactions reagiert.",
|
||||||
|
socialLinks: [{ href: "#", icon: <BiLogoLinkedinSquare className="size-6" /> }],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
footerContent: {
|
||||||
|
heading: "",
|
||||||
|
description: "",
|
||||||
|
button: { title: "", variant: "secondary" },
|
||||||
|
},
|
||||||
|
};
|
||||||
26
relume-test/src/pages/Speaker.tsx
Normal file
26
relume-test/src/pages/Speaker.tsx
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
import { Navbar3 } from "../components/Navbar";
|
||||||
|
import { Header23 } from "../components/Header23";
|
||||||
|
import { Filters5 } from "../components/Filters5";
|
||||||
|
import { Team4 } from "../components/Team4";
|
||||||
|
import { Footer3 } from "../components/Footer";
|
||||||
|
|
||||||
|
const Programm = () => {
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<Navbar3 />
|
||||||
|
<Header23
|
||||||
|
heading="Unsere Speaker"
|
||||||
|
description="Erfahre von den klügsten Köpfen der Branche, wie sie komplexe Design-Herausforderungen meistern."
|
||||||
|
buttons={[
|
||||||
|
{ title: "Zu den Speakern", variant: "primary" },
|
||||||
|
{ title: "Zum Programm", variant: "secondary" },
|
||||||
|
]}
|
||||||
|
/>
|
||||||
|
<Filters5 />
|
||||||
|
<Team4 />
|
||||||
|
<Footer3 />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default Programm;
|
||||||
0
relume-test/src/pages/Tickets.tsx
Normal file
0
relume-test/src/pages/Tickets.tsx
Normal file
Loading…
x
Reference in New Issue
Block a user