From 2576779644ad2e1b5b313fe2affc1690e27df262 Mon Sep 17 00:00:00 2001 From: Thomas KLEIN Date: Mon, 27 Jan 2025 23:14:08 +0100 Subject: [PATCH] Add buttonlink component --- src/components/ButtonLink/ButtonLink.tsx | 87 ++++++++++++++++++++ src/components/ButtonLink/ButtonLinkProps.ts | 11 +++ src/components/Speakers/Speakers.tsx | 15 +++- src/components/Speakers/SpeakersList.tsx | 6 +- src/components/SponsorList/SponsorList.tsx | 11 ++- src/components/TopBanner/TopBanner.tsx | 33 ++++---- src/layouts/Header/Header.tsx | 8 +- 7 files changed, 148 insertions(+), 23 deletions(-) create mode 100644 src/components/ButtonLink/ButtonLink.tsx create mode 100644 src/components/ButtonLink/ButtonLinkProps.ts 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 +