Skip to content
Snippets Groups Projects
BildPanel.tsx 1.78 KiB
Newer Older
import React from 'react';
import PanelWrapper from "../../meta/PanelWrapper";
import classNames from "../../util/classNames";
import PanelContent from "../../meta/PanelContent";

export type BildPanelDefinition = {
  url: string,
  fit?: "fill" | "fit",
  title?: string,
  description?: string,
  gradient?: boolean
}

const BildPanel = (props: {definition: BildPanelDefinition}) => {
  return (
    <PanelWrapper className={"relative"}>
      <div
        className={"absolute inset-0 h-full w-full bg-cover blur-lg backdrop-brightness-75"}
        style={{backgroundImage: `url('${props.definition.url}')`}}
      >
      </div>

      <div className={"absolute inset-0 h-full w-full flex"}>
        <div
          className={classNames(
            "bg-no-repeat bg-center flex-1 relative",
            (props.definition.fit === "fit") ? "bg-contain" : "bg-cover"
          )}
          style={{
            backgroundImage: `url('${props.definition.url}')`
          }}
        >
          {props.definition.title && (
            <>
              <div className={classNames(
                "absolute inset-0 w-full h-full",
                (props.definition.gradient ?? true) ? "bg-lower-gradient" : ""
              )}>
              </div>

              <PanelContent className={"absolute inset-0 w-full h-full flex flex-col justify-end"}>
                <h2 className={"text-xl font-semibold"}>
                  {props.definition.title}
                </h2>

                {props.definition.description && (
                  <p className={"mt-1 text-sm max-w-5xl"}>
                    {props.definition.description}
                  </p>
                )}
              </PanelContent>
            </>
          )}
        </div>
      </div>
    </PanelWrapper>
  );
};

export default BildPanel;