Skip to content
Snippets Groups Projects
Hero.tsx 5.6 KiB
Newer Older
Toavina's avatar
Toavina committed
import React from "react"
import { Button, Card, Carousel } from "@onegeo-suite/gatsby-theme-onegeo"
Julien MARGAIL's avatar
Julien MARGAIL committed
import cx from "classix"
Julien MARGAIL's avatar
Julien MARGAIL committed
import { merge } from "../utils"

interface Service {
    name: string
    description: string
    image: string
    url: string
interface Action {
    name: string
    url: string
interface Bg {
    src: string
}
interface Props {
    title?: string
    subtitle?: string
    content?: string
    action?: Action
    services?: Array<Service>
    bgImage?: Array<Bg>
    size?: "xs" | "base" | "xl"
}

const Hero = (props: Props) => {
Toavina's avatar
Toavina committed
    // Data structure (default value)
    const {
        title = "eGEO Project",
        subtitle = "Hub géospatial collaboratif",
        content = "Solution Open Source sur-mesure pour communiquer et valoriser les données disponibles sur votre territoire ou vos infrastructures.",
Toavina's avatar
Toavina committed
        action = {
            name: "Découvres nos cartes interactives",
            url: "#",
Toavina's avatar
Toavina committed
        },
        services = [
            {
                name: "Datastore",
                description: "Accédez à votre catalogue de données.",
                image: "../images/hero/datastore.png",
                url: "#",
Toavina's avatar
Toavina committed
            },
            {
                name: "Map",
                description:
Toavina's avatar
Toavina committed
                    "Consulter, gérer, mettre à jour et diffuser vos contenus cartographiques.",
                image: "../images/hero/datastore.png",
                url: "#",
Toavina's avatar
Toavina committed
            },
            {
                name: "Dataviz",
                description: "Croisez et mettez en forme vos données.",
                image: "../images/hero/datastore.png",
                url: "#",
Toavina's avatar
Toavina committed
            },
            {
                name: "Contrib",
                description: "Validez et collectez vos informations.",
                image: "../images/hero/datastore.png",
                url: "#",
Toavina's avatar
Toavina committed
            },
        ],
        bgImage = [
            {
Toavina Rasoatamindrainy's avatar
Toavina Rasoatamindrainy committed
                src: "https://images.unsplash.com/photo-1608501078713-8e445a709b39?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxzZWFyY2h8Mnx8d2FsbHBhcGVyJTIwNGt8ZW58MHx8MHx8&w=1000&q=80",
Toavina Rasoatamindrainy's avatar
Toavina Rasoatamindrainy committed
                src: "https://images.unsplash.com/photo-1608501078713-8e445a709b39?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxzZWFyY2h8Mnx8d2FsbHBhcGVyJTIwNGt8ZW58MHx8MHx8&w=1000&q=80",
Toavina Rasoatamindrainy's avatar
Toavina Rasoatamindrainy committed
                src: "https://images.unsplash.com/photo-1608501078713-8e445a709b39?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxzZWFyY2h8Mnx8d2FsbHBhcGVyJTIwNGt8ZW58MHx8MHx8&w=1000&q=80",
            },
        ],
        size = "base",
Julien MARGAIL's avatar
Julien MARGAIL committed
        options = {},
Toavina's avatar
Toavina committed
    } = props
Toavina Rasoatamindrainy's avatar
Toavina Rasoatamindrainy committed
    let imageFondList, imageFond

    if (bgImage.length > 1) {
Toavina Rasoatamindrainy's avatar
Toavina Rasoatamindrainy committed
        imageFondList = bgImage
        imageFond = [
            imageFondList.map((image: any) => {
                return image
            }),
        ]
    } else {
Toavina Rasoatamindrainy's avatar
Toavina Rasoatamindrainy committed
        imageFond = bgImage![0]
    }

Toavina's avatar
Toavina committed
    return (
Julien MARGAIL's avatar
Julien MARGAIL committed
            className={cx(
                "relative z-0 bg-cover",
                size == "base" ? "mb-28 h-[60vh]" : "",
                size == "xl" ? "h-[75vh]" : "",
                size == "xs" ? "mb-56 h-[50vh]" : ""
Julien MARGAIL's avatar
Julien MARGAIL committed
            )}
            style={{ backgroundImage: `url(${imageFond})` }}
        >
Toavina Rasoatamindrainy's avatar
Toavina Rasoatamindrainy committed
            {bgImage!.length > 1 && (
                <Carousel
                    height={`${size == "base" ? "h-[60vh]" : ""} ${
                        size == "xl" ? "h-[75vh]" : ""
                    } ${size == "xs" ? "h-[50vh]" : ""}`}
Toavina Rasoatamindrainy's avatar
Toavina Rasoatamindrainy committed
                    images={imageFond[0]}
                    animation="fade"
                    delay={3000}
                />
            )}
Julien MARGAIL's avatar
Julien MARGAIL committed
            <div className="absolute top-0 z-10 h-full w-full bg-gradient-to-r from-slate-500 opacity-80"></div>
            <div className={"absolute top-0 z-20 mb-5 w-full text-center"}>
                <div className="mx-auto mt-20 max-w-4xl">
                    <h1 className="text-neutral-content mb-5 text-3xl font-extrabold tracking-tight lg:text-6xl">
Toavina's avatar
Toavina committed
                        {title}
                        <div className="text-primary">{subtitle}</div>
                    </h1>
                    <p className="mb-5">{content}</p>
                    {action && action.name !== "" ? (
Toavina's avatar
Toavina committed
                        <Button
Julien MARGAIL's avatar
Julien MARGAIL committed
                            className="btn-primary mt-10 text-white"
Toavina's avatar
Toavina committed
                            {...action}
                        />
                    ) : null}
                </div>
            </div>
Julien MARGAIL's avatar
Julien MARGAIL committed
                className={cx(
Julien MARGAIL's avatar
Julien MARGAIL committed
                    "absolute z-20 flex w-full flex-row flex-wrap justify-center gap-6",
Julien MARGAIL's avatar
Julien MARGAIL committed
                    size == "base" ? "-bottom-12" : "",
                    size == "xl" ? "bottom-6" : "",
                    size == "xs" ? "-bottom-52" : ""
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
                {services &&
                    services.map((service, idx) => (
Julien MARGAIL's avatar
Julien MARGAIL committed
                        <Card
                            key={idx}
                            layout="left"
                            size="xs"
                            {...service}
Julien MARGAIL's avatar
Julien MARGAIL committed
                            options={merge(
                                {
                                    class: {
                                        main: "w-96",
                                        body: "place-content-center",
                                        image: "m-auto h-16",
                                        imageComponent: "object-scale-down",
                                    },
                                },
                                merge(options?.card, service?.options)
                            )}
Tovo Ramontalambo's avatar
Tovo Ramontalambo committed
                    ))}
Toavina's avatar
Toavina committed
            </div>
Toavina's avatar
Toavina committed
export default Hero