diff --git a/src/components/ButtonLink/ButtonLink.tsx b/src/components/ButtonLink/ButtonLink.tsx
new file mode 100644
index 0000000..8764f9c
--- /dev/null
+++ b/src/components/ButtonLink/ButtonLink.tsx
@@ -0,0 +1,87 @@
+import Link from "next/link";
+import React, {ReactNode} from "react";
+import classNames from "classnames";
+import {ButtonLinkProps} from "@/components/ButtonLink/ButtonLinkProps";
+
+const ButtonLink = ({
+ variant,
+ href,
+ target,
+ rel,
+ iconPosition,
+ icon,
+ children
+}: ButtonLinkProps) => {
+
+ const variantClass = {
+ primary: "bg-white text-black",
+ secondary: "bg-white text-primary hover:bg-primary hover:text-white",
+ "secondary-invert": "bg-primary text-white hover:bg-white hover:text-primary",
+ "soft-pink": "bg-purple-500 text-white hover:bg-white hover:text-purple-500",
+ };
+
+ const iconClass = {
+ primary: "bg-none text-black",
+ secondary: "bg-primary text-white group-hover:bg-white group-hover:text-primary",
+ "secondary-invert": "bg-white text-primary group-hover:bg-primary group-hover:text-white",
+ "soft-pink": "bg-purple-500 text-white group-hover:bg-white group-hover:text-purple-500",
+ };
+
+ const extraClass = iconPosition !== undefined
+ ? "pl-5 pr-3"
+ : "px-5";
+
+ const renderContent = (content: ReactNode) => {
+ const iconClassName: string = "inline-block p-1 rounded-full";
+
+ if (iconPosition === "left") {
+ return (
+ <>
+
+ {icon}
+
+
+ {content}
+
+ >
+ );
+ }
+ if (iconPosition === "right") {
+ return (
+ <>
+
+ {content}
+
+
+ {icon}
+
+ >
+ );
+ }
+
+ return (<>{content}>);
+ };
+
+ return (
+
+ {renderContent(children)}
+
+ );
+};
+
+export default ButtonLink;
diff --git a/src/components/ButtonLink/ButtonLinkProps.ts b/src/components/ButtonLink/ButtonLinkProps.ts
new file mode 100644
index 0000000..08cf6fb
--- /dev/null
+++ b/src/components/ButtonLink/ButtonLinkProps.ts
@@ -0,0 +1,11 @@
+import { ReactNode } from "react";
+
+export type ButtonLinkProps = {
+ variant: "primary" | "secondary" | "secondary-invert" | "soft-pink",
+ href: string,
+ target?: string,
+ rel?: string,
+ icon?: ReactNode,
+ iconPosition?: "left" | "right",
+ children?: ReactNode
+};
diff --git a/src/components/Speakers/Speakers.tsx b/src/components/Speakers/Speakers.tsx
index f46f51a..d385a55 100644
--- a/src/components/Speakers/Speakers.tsx
+++ b/src/components/Speakers/Speakers.tsx
@@ -3,6 +3,8 @@ import React from "react";
import Typography from "../Typography/Typography";
import BackgroundImage from "../BackgroundImage/BackgroundImage";
import SpeakersList from "./SpeakersList";
+import ButtonLink from "@/components/ButtonLink/ButtonLink";
+import { IoIosArrowForward } from "react-icons/io";
const Speakers = () => {
return (
@@ -34,7 +36,18 @@ const Speakers = () => {
imagePath="/images/pattern_speakers.svg"
className="w-full md:w-1/2"
>
-
+
+ }
+ >
+ Rejoignez les conférenciers de MM25FR
+
+
diff --git a/src/components/Speakers/SpeakersList.tsx b/src/components/Speakers/SpeakersList.tsx
index 3d3ae66..5e74ff9 100644
--- a/src/components/Speakers/SpeakersList.tsx
+++ b/src/components/Speakers/SpeakersList.tsx
@@ -10,6 +10,7 @@ import ClientOnly from "@/helpers/ClientOnly";
import TopBanner from "@/components/TopBanner/TopBanner";
import Speaker from "./Speaker/Speaker";
import SpeakerPopIn from "./Speaker/SpeakerPopIn";
+import ButtonLink from "@/components/ButtonLink/ButtonLink";
const speakers: Speaker[] = [
{
@@ -103,10 +104,11 @@ const SpeakersList = () => {
+ >
+ Découvrir les speakers
+
-
+
+ Devenir sponsor
+ Voir tous les sponsors
+
{sortedSponsors.map((sponsor: SponsorProps, key: number) => (
diff --git a/src/components/TopBanner/TopBanner.tsx b/src/components/TopBanner/TopBanner.tsx
index c26e117..69c3360 100644
--- a/src/components/TopBanner/TopBanner.tsx
+++ b/src/components/TopBanner/TopBanner.tsx
@@ -1,4 +1,4 @@
-import React from "react";
+import React, {ReactNode} from "react";
import Typography from "../Typography/Typography";
import BackgroundImage from "../BackgroundImage/BackgroundImage";
import { IoIosArrowBack, IoIosArrowForward } from "react-icons/io";
@@ -8,7 +8,7 @@ import ClientOnly from "@/helpers/ClientOnly";
interface TopBannerProps {
title: string;
backgroundImage?: string;
- canSlide?: boolean;
+ children?: ReactNode;
onPrevClick?: () => void;
onNextClick?: () => void;
}
@@ -16,27 +16,30 @@ interface TopBannerProps {
const TopBanner = ({
title,
backgroundImage,
- canSlide,
+ children,
onPrevClick,
onNextClick,
}: TopBannerProps) => {
const { width } = useWindowSize();
const bannerContent = (
-
+
{title}
- {canSlide && width > 768 && (
-
-
-
-
- )}
+
+ {children}
+ {onPrevClick && onNextClick && width > 768 && (
+
+
+
+
+ )}
+
);
@@ -46,7 +49,7 @@ const TopBanner = ({
{backgroundImage ? (
{bannerContent}
diff --git a/src/layouts/Header/Header.tsx b/src/layouts/Header/Header.tsx
index bbb8b72..493b62e 100644
--- a/src/layouts/Header/Header.tsx
+++ b/src/layouts/Header/Header.tsx
@@ -2,6 +2,9 @@ import BackgroundImage from "@/components/BackgroundImage/BackgroundImage";
import Logo from "@/components/Logo/Logo";
import Navigation from "./Navigation/Navigation";
import Container from "../Container";
+import ButtonLink from "@/components/ButtonLink/ButtonLink";
+import {FaTicketAlt} from "react-icons/fa";
+import React from "react";
const Header = () => {
const HeaderContent = () => (
@@ -9,9 +12,12 @@ const Header = () => {
+ className="flex w-full justify-between gap-12 items-center h-20 px-4 md:px-14">
+ }>
+ J’achète mon billet
+