zebflow 0.11.14

Reactive web automation platform — pipelines, templates, and real-time collaboration in a single binary.
Documentation
import { cx } from "zeb/react";
import { buttonVariants } from "zeb/ui/button";

/**
 * Pagination — shadcn/ui's pagination, on Zebflow's engine.
 *
 * `PaginationLink` reuses `zeb/ui/button`'s `buttonVariants` exactly like
 * upstream reuses its own `buttonVariants`. Icons are inline `<svg>` (no
 * lucide).
 */

export function Pagination({ className, children, ...rest }) {
  return (
    <nav role="navigation" aria-label="pagination" data-slot="pagination" className={cx("mx-auto flex w-full justify-center", className)} {...rest}>
      {children}
    </nav>
  );
}

export function PaginationContent({ className, children, ...rest }) {
  return (
    <ul data-slot="pagination-content" className={cx("flex flex-row items-center gap-1", className)} {...rest}>
      {children}
    </ul>
  );
}

export function PaginationItem({ children, ...rest }) {
  return (
    <li data-slot="pagination-item" {...rest}>
      {children}
    </li>
  );
}

export function PaginationLink({ className, isActive, size = "icon", children, ...rest }) {
  return (
    <a
      aria-current={isActive ? "page" : undefined}
      data-slot="pagination-link"
      data-active={isActive}
      className={buttonVariants({ variant: isActive ? "outline" : "ghost", size, className })}
      {...rest}
    >
      {children}
    </a>
  );
}

export function PaginationPrevious({ className, ...rest }) {
  return (
    <PaginationLink aria-label="Go to previous page" size="default" className={cx("gap-1 px-2.5 sm:pl-2.5", className)} {...rest}>
      <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" className="size-4">
        <path d="m15 18-6-6 6-6" />
      </svg>
      <span className="hidden sm:block">Previous</span>
    </PaginationLink>
  );
}

export function PaginationNext({ className, ...rest }) {
  return (
    <PaginationLink aria-label="Go to next page" size="default" className={cx("gap-1 px-2.5 sm:pr-2.5", className)} {...rest}>
      <span className="hidden sm:block">Next</span>
      <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" className="size-4">
        <path d="m9 18 6-6-6-6" />
      </svg>
    </PaginationLink>
  );
}

export function PaginationEllipsis({ className, ...rest }) {
  return (
    <span aria-hidden data-slot="pagination-ellipsis" className={cx("flex size-9 items-center justify-center", className)} {...rest}>
      <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" className="size-4">
        <circle cx="12" cy="12" r="1" />
        <circle cx="19" cy="12" r="1" />
        <circle cx="5" cy="12" r="1" />
      </svg>
      <span className="sr-only">More pages</span>
    </span>
  );
}

export default Pagination;