Docs
Page Utils

Page Utils

Installation

"use client";
 
import Link from "next/link";
import type { VariantProps } from "cva";
import { cva } from "cva";
import { ArrowLeft } from "lucide-react";
 
import { buttonVariants } from "@/components/ui/button";
import { Container, ContainerInner } from "@/components/ui/container";
import type { NextRoute } from "@/lib/navigation/utils";
import { cn } from "@/lib/utils";
 
const barVariants = cva({
  base: "z-50",
  variants: {
    padding: {
      top: "pt-3 sm:pt-6",
      bottom: "pb-3 sm:pb-6",
      y: "py-3 sm:py-6",
      none: "",
    },
    border: {
      false: "",
      true: "border-b",
    },
    shadow: {
      false: "",
      true: "shadow-tight",
    },
  },
  defaultVariants: {
    padding: "top",
    border: false,
    shadow: false,
  },
});
 
export const PageBar = ({
  children,
  padding,
  className,
  border,
  shadow,
}: {
  children?: React.ReactNode;
  className?: string;
} & VariantProps<typeof barVariants>) => {
  return (
    <Container
      className={cn(barVariants({ padding, border, shadow }), className)}
    >
      <ContainerInner>
        <div className="grid grid-cols-[auto_1fr] items-center gap-4">
          {children}
        </div>
      </ContainerInner>
    </Container>
  );
};
 
export const PageBarLeft = ({
  children,
  className,
}: {
  children?: React.ReactNode;
  className?: string;
}) => {
  return <div className={cn("flex items-center", className)}>{children}</div>;
};
 
export const PageBarRight = ({
  children,
  className,
}: {
  children?: React.ReactNode;
  className?: string;
}) => {
  return <div className={cn("flex justify-end", className)}>{children}</div>;
};
 
export const BackButton = <TRoute,>({
  className,
  href,
}: {
  className?: string;
  href: NextRoute<TRoute>;
}) => {
  return (
    <Link
      href={href}
      className={cn(
        buttonVariants({ variant: "ghost", icon: true }),
        "mr-2",
        className,
      )}
    >
      <ArrowLeft />
    </Link>
  );
};
 
export const PageTitle = ({ children }: { children: React.ReactNode }) => {
  return (
    <h1
      className={cn(
        "scroll-m-20 truncate text-lg font-medium tracking-tight lg:text-xl",
      )}
    >
      {children}
    </h1>
  );
};