Blocks

Blog Post Header 2

standard
1 ColumnText Align LeftImageAuthorDateBlog Post Header Section
Blog Post Header 2

Code

relume-blog-post-header2.tsx
import { Badge } from "@/components/ui/badge";
import { Button, type ButtonProps } from "@/components/ui/button";
import { ChevronLeft, FacebookLogo, Link, LinkedinLogo, XLogo } from "relume-icons";

type ImageProps = {
  src: string;
  alt?: string;
};

type PostDetails = {
  title: string;
  description: string;
};

type SocialMediaLinksProps = {
  icon: React.ReactNode;
  url: string;
};

type Props = {
  button: ButtonProps;
  category: string;
  readTime: string;
  heading: string;
  image: ImageProps;
  postDetails: PostDetails[];
  socialMediaLinks: SocialMediaLinksProps[];
};

export type BlogPostHeader2Props = React.ComponentPropsWithoutRef<"section"> & Partial<Props>;

export const BlogPostHeader2 = (props: BlogPostHeader2Props) => {
  const { button, category, readTime, heading, image, postDetails, socialMediaLinks } = {
    ...BlogPostHeader2Defaults,
    ...props,
  };
  return (
    <section className="px-[5%] py-16 md:py-24 lg:py-28">
      <div className="container">
        <div className="mb-12 flex flex-col items-start justify-start md:mb-18 lg:mb-20">
          <Button {...button} className="mb-6 md:mb-8" asChild>
            <a>{button.title}</a>
          </Button>
          <div className="mb-3 flex w-full items-center justify-start md:mb-4">
            <Badge className="mr-4">{category}</Badge>
            <p className="inline text-small font-semibold">{readTime}</p>
          </div>
          <h1 className="text-h2 font-bold">{heading}</h1>
        </div>
        <div className="mx-auto mb-8 w-full overflow-hidden md:mb-12 lg:mb-8">
          <img
            src={image.src}
            className="aspect-[5/2] size-full rounded-image object-cover"
            alt={image.alt}
          />
        </div>
        <div className="flex w-full flex-col items-start justify-between md:flex-row">
          <div className="mb-4 flex items-center sm:mb-8 md:mb-0">
            {postDetails.map((detail, index) => (
              <div key={index} className="mr-8 md:mr-10 lg:mr-12">
                <p className="mb-2">{detail.title}</p>
                <p className="font-medium">{detail.description}</p>
              </div>
            ))}
          </div>
          <div className="grid grid-flow-col grid-cols-[max-content] items-start gap-2">
            {socialMediaLinks.map((link, index) => (
              <a key={index} href={link.url} className="rounded-[1.25rem] bg-scheme-foreground p-1">
                {link.icon}
              </a>
            ))}
          </div>
        </div>
      </div>
    </section>
  );
};

export const BlogPostHeader2Defaults: Props = {
  button: {
    title: "All Posts",
    variant: "link",
    size: "link",
    iconLeft: <ChevronLeft className="text-scheme-text" />,
  },
  category: "Category",
  readTime: "5 min read",
  heading: "Blog title heading will go here",
  postDetails: [
    { title: "Written by", description: "Full Name" },
    { title: "Published on", description: "22 January 2021" },
  ],
  socialMediaLinks: [
    { url: "#", icon: <Link className="size-6 text-scheme-text" /> },
    { url: "#", icon: <LinkedinLogo className="size-6 text-scheme-text" /> },
    { url: "#", icon: <XLogo className="size-6 p-0.5 text-scheme-text" /> },
    { url: "#", icon: <FacebookLogo className="size-6 text-scheme-text" /> },
  ],
  image: {
    src: "https://d22po4pjz3o32e.cloudfront.net/placeholder-image.svg",
    alt: "Relume placeholder image",
  },
};

npm i @radix-ui/react-accordion @radix-ui/react-slot class-variance-authority@0.7.1 clsx@^2.1.1 relume-icons@1.3.0 tailwind-merge@^2.2.2