import React from "react";
import { ChevronLeftIcon, ChevronRightIcon } from "@sanity/icons";
interface PaginationProps {
page: number;
total: number;
pageSize: number;
onPage: (p: number) => void;
onPageSizeChange: (size: number) => void;
}
export default function Pagination({
page,
total,
pageSize,
onPage,
onPageSizeChange,
}: PaginationProps) {
const totalPages = Math.ceil(total / pageSize);
const isFirst = page === 0;
const isLast = page >= totalPages - 1;
if (total === 0) return null;
const navStyle = (disabled: boolean): React.CSSProperties => ({
display: "flex",
alignItems: "center",
justifyContent: "center",
width: 34,
height: 34,
borderRadius: 8,
border: "1px solid var(--card-border-color)",
background: "var(--card-bg-color)",
color: "var(--card-link-color)",
cursor: disabled ? "not-allowed" : "pointer",
transition: "all 0.15s cubic-bezier(0.4, 0, 0.2, 1)",
flexShrink: 0,
opacity: disabled ? 0.4 : 1,
outline: "none",
});
return (
Show
per page
Showing{" "}
{page * pageSize + 1}–{Math.min((page + 1) * pageSize, total)}
{" "}
of {total} items
{totalPages > 1 && (
{Array.from({ length: totalPages }).map((_, i) => {
if (totalPages > 6 && i !== 0 && i !== totalPages - 1 && Math.abs(page - i) > 1) {
if (i === 1 && page > 2) {
return (
...
);
}
if (i === totalPages - 2 && page < totalPages - 3) {
return (
...
);
}
return null;
}
const isCurrent = page === i;
return (
);
})}
)}
);
}