SPB Git forge
3commits 1branches 0releases
417.0 KBsize
maindefault branch
10 days agolast push
TypeScript 66.5% Python 30.9% JavaScript 1.4% CSS 0.7%
1.4 KB · 24 lines tsx
Raw Blame History
1import Link from 'next/link';2import { cn } from '@/lib/cn';3import { fmtInt } from '@/lib/format';45/** URL-driven pagination (server component). `makeHref(page)` builds the link preserving current filters. */6export function Pagination({ page, pages, total, pageSize, makeHref, className }: { page: number; pages: number; total: number; pageSize: number; makeHref: (p: number) => string; className?: string }) {7  if (pages <= 1) return <p className={cn('text-xs text-ink-3', className)}>{fmtInt(total)} results</p>;8  const from = (page - 1) * pageSize + 1;9  const to = Math.min(total, page * pageSize);10  const btn = 'inline-flex h-10 min-w-10 items-center justify-center rounded-md border border-rule px-3 text-sm text-ink-2 hover:bg-plane-2 hover:text-ink';11  return (12    <nav className={cn('flex flex-wrap items-center justify-between gap-3', className)} aria-label="Pagination">13      <p className="tnum text-xs text-ink-3">14        {fmtInt(from)}–{fmtInt(to)} of {fmtInt(total)}15      </p>16      <div className="flex items-center gap-1.5">17        {page > 1 ? <Link href={makeHref(page - 1)} className={btn} rel="prev">‹ Prev</Link> : <span className={cn(btn, 'opacity-40')}>‹ Prev</span>}18        <span className="mono px-2 text-xs text-ink-3">{page} / {fmtInt(pages)}</span>19        {page < pages ? <Link href={makeHref(page + 1)} className={btn} rel="next">Next ›</Link> : <span className={cn(btn, 'opacity-40')}>Next ›</span>}20      </div>21    </nav>22  );23}24