सामग्री पर जाएँ

पेजिनेशन

खोज परिणामों, तालिकाओं और अभिलेखागारों के लिए संख्यांकित पृष्ठ लिंक, पिछले/अगले नियंत्रणों के साथ — नियोब्रूटलिस्ट बॉर्डर्स-एंड-शैडोज़ शैली में।

import {
  Pagination,
  PaginationContent,

पेजिनेशन लंबी रिज़ल्ट सेट को नंबर वाले पेज लिंक में तोड़ता है, previous और next कंट्रोल के साथ। नीचे कोई प्रिमिटिव नहीं — nav लैंडमार्क सादे एंकर टैग लपेटता है, हर एक Button से रेंडर, नियोब्रूटलिस्ट रेसिपी के अनुसार स्टाइल किया गया है: मोटे बॉर्डर, कठोर छायाएँ और बोल्ड टाइपोग्राफ़ी।

इसे इन स्थितियों में चुनें:

  • सर्च और लिस्टिंग पेज — प्रोडक्ट ग्रिड, जॉब बोर्ड, डायरेक्टरी जहाँ उपयोगकर्ता सीधे page 12 पर जाएँ।
  • डेटा टेबल — एडमिन व्यू में rows-per-page सेलेक्टर के साथ icons-only वैरिएंट जोड़ें।
  • ब्लॉग और डॉक आर्काइव — असली <a> लिंक हर पेज को crawlable URL देते हैं, जो infinite scroll नहीं दे सकता।

इंस्टॉलेशन

pnpm dlx shadcn@latest add https://neobrutalism.com/r/base/pagination.json
npx shadcn@latest add https://neobrutalism.com/r/base/pagination.json
yarn dlx shadcn@latest add https://neobrutalism.com/r/base/pagination.json
bunx --bun shadcn@latest add https://neobrutalism.com/r/base/pagination.json

निम्नलिखित कोड को अपने प्रोजेक्ट में कॉपी और पेस्ट करें.

components/ui/pagination.tsx
import * as React from "react"
import {
  ChevronLeftIcon,
  ChevronRightIcon,
  MoreHorizontalIcon,
} from "lucide-react"

import { cn } from "@/lib/utils"
import { Button } from "@/components/ui/button"

function Pagination({ className, ...props }: React.ComponentProps<"nav">) {
  return (
    <nav
      role="navigation"
      aria-label="pagination"
      data-slot="pagination"
      className={cn("mx-auto flex w-full justify-center", className)}
      {...props}
    />
  )
}

function PaginationContent({
  className,
  ...props
}: React.ComponentProps<"ul">) {
  return (
    <ul
      data-slot="pagination-content"
      className={cn("flex items-center gap-0.5", className)}
      {...props}
    />
  )
}

function PaginationItem({ ...props }: React.ComponentProps<"li">) {
  return <li data-slot="pagination-item" {...props} />
}

type PaginationLinkProps = {
  isActive?: boolean
} & Pick<React.ComponentProps<typeof Button>, "size"> &
  React.ComponentProps<"a">

function PaginationLink({
  className,
  isActive,
  size = "icon",
  ...props
}: PaginationLinkProps) {
  return (
    <Button
      asChild
      variant={isActive ? "default" : "ghost"}
      size={size}
      className={cn(className)}
    >
      <a
        aria-current={isActive ? "page" : undefined}
        data-slot="pagination-link"
        data-active={isActive}
        {...props}
      />
    </Button>
  )
}

function PaginationPrevious({
  className,
  text = "Previous",
  ...props
}: React.ComponentProps<typeof PaginationLink> & { text?: string }) {
  return (
    <PaginationLink
      aria-label="Go to previous page"
      size="default"
      className={cn("pl-1.5!", className)}
      {...props}
    >
      <ChevronLeftIcon data-icon="inline-start" className="cn-rtl-flip" />
      <span className="hidden sm:block">{text}</span>
    </PaginationLink>
  )
}

function PaginationNext({
  className,
  text = "Next",
  ...props
}: React.ComponentProps<typeof PaginationLink> & { text?: string }) {
  return (
    <PaginationLink
      aria-label="Go to next page"
      size="default"
      className={cn("pr-1.5!", className)}
      {...props}
    >
      <span className="hidden sm:block">{text}</span>
      <ChevronRightIcon data-icon="inline-end" className="cn-rtl-flip" />
    </PaginationLink>
  )
}

function PaginationEllipsis({
  className,
  ...props
}: React.ComponentProps<"span">) {
  return (
    <span
      aria-hidden
      data-slot="pagination-ellipsis"
      className={cn(
        "flex size-8 items-center justify-center [&_svg:not([class*='size-'])]:size-4",
        className
      )}
      {...props}
    >
      <MoreHorizontalIcon />
      <span className="sr-only">More pages</span>
    </span>
  )
}

export {
  Pagination,
  PaginationContent,
  PaginationEllipsis,
  PaginationItem,
  PaginationLink,
  PaginationNext,
  PaginationPrevious,
}

अपने प्रोजेक्ट सेटअप के अनुसार इंपोर्ट पाथ अपडेट करें.

उपयोग

import {
  Pagination,
  PaginationContent,
  PaginationEllipsis,
  PaginationItem,
  PaginationLink,
  PaginationNext,
  PaginationPrevious,
} from "@/components/ui/pagination"
<Pagination>
  <PaginationContent>
    <PaginationItem>
      <PaginationPrevious href="#" />
    </PaginationItem>
    <PaginationItem>
      <PaginationLink href="#">1</PaginationLink>
    </PaginationItem>
    <PaginationItem>
      <PaginationLink href="#" isActive>
        2
      </PaginationLink>
    </PaginationItem>
    <PaginationItem>
      <PaginationLink href="#">3</PaginationLink>
    </PaginationItem>
    <PaginationItem>
      <PaginationEllipsis />
    </PaginationItem>
    <PaginationItem>
      <PaginationNext href="#" />
    </PaginationItem>
  </PaginationContent>
</Pagination>

कंपोज़िशन

Pagination बनाने के लिए निम्नलिखित कंपोज़िशन का उपयोग करें:

Pagination
└── PaginationContent
    ├── PaginationItem
    │   └── PaginationPrevious
    ├── PaginationItem
    │   └── PaginationLink
    ├── PaginationItem
    │   └── PaginationEllipsis
    └── PaginationItem
        └── PaginationNext

उदाहरण

सरल

केवल पेज संख्याओं के साथ एक सरल पेजिनेशन.

import {
  Pagination,
  PaginationContent,

केवल आइकन

पेज संख्याओं के बिना, केवल अगले और पिछले बटन का उपयोग करें. यह प्रति पेज पंक्ति चयनकर्ता वाली डेटा टेबल के लिए उपयोगी है.

import { Field, FieldLabel } from "@/components/ui/field"
import {
  Pagination,

Next.js

डिफ़ॉल्ट रूप से <PaginationLink /> कंपोनेंट एक <a /> टैग रेंडर करता है.

Next.js के <Link /> कंपोनेंट का उपयोग करने के लिए, pagination.tsx में निम्नलिखित बदलाव करें.

+ import Link from "next/link"
 
- type PaginationLinkProps = ... & React.ComponentProps<"a">
+ type PaginationLinkProps = ... & React.ComponentProps<typeof Link>
 
const PaginationLink = ({...props }: ) => (
  <PaginationItem>
-   <a>
+   <Link>
      // ...
-   </a>
+   </Link>
  </PaginationItem>
)
 

RTL

Neobrutalism में RTL समर्थन सक्षम करने के लिए, RTL कॉन्फ़िगरेशन गाइड देखें.

"use client"

import * as React from "react"

चेंजलॉग

RTL समर्थन

यदि आप Pagination कंपोनेंट के किसी पिछले संस्करण से अपग्रेड कर रहे हैं, तो text prop जोड़ने के लिए आपको निम्नलिखित बदलाव लागू करने होंगे:

PaginationPrevious अपडेट करें.

  function PaginationPrevious({
    className,
+   text = "Previous",
    ...props
- }: React.ComponentProps<typeof PaginationLink>) {
+ }: React.ComponentProps<typeof PaginationLink> & { text?: string }) {
    return (
      <PaginationLink
        aria-label="Go to previous page"
        size="default"
        className={cn("cn-pagination-previous", className)}
        {...props}
      >
        <ChevronLeftIcon />
        <span className="cn-pagination-previous-text hidden sm:block">
-         Previous
+         {text}
        </span>
      </PaginationLink>
    )
  }

PaginationNext अपडेट करें.

  function PaginationNext({
    className,
+   text = "Next",
    ...props
- }: React.ComponentProps<typeof PaginationLink>) {
+ }: React.ComponentProps<typeof PaginationLink> & { text?: string }) {
    return (
      <PaginationLink
        aria-label="Go to next page"
        size="default"
        className={cn("cn-pagination-next", className)}
        {...props}
      >
-       <span className="cn-pagination-next-text hidden sm:block">Next</span>
+       <span className="cn-pagination-next-text hidden sm:block">{text}</span>
        <ChevronRightIcon />
      </PaginationLink>
    )
  }

एक्सेसिबिलिटी

पेजिनेशन लिंक-आधारित नेविगेशन है, composite widget नहीं, इसलिए समर्पित WAI-ARIA पैटर्न नहीं — नेटिव लिंक सेमेंटिक्स काम करते हैं। रूट <nav> लैंडमार्क aria-label="pagination" के साथ रेंडर करता है, सक्रिय PaginationLink पर aria-current="page" होता है, previous/next कंट्रोल स्पष्ट aria-label भेजते हैं, और PaginationEllipsis aria-hidden है जिसमें स्क्रीन-रीडर-ओनली "More pages" टेक्स्ट है।

कीबोर्ड इंटरैक्शन ब्राउज़र का नेटिव लिंक व्यवहार है:

कीबोर्ड इंटरैक्शन:

कुंजीक्रिया
Tab / Shift + Tabपेज लिंकों के बीच फ़ोकस ले जाएँ / बाहर
Enterफ़ोकस किए लिंक का पालन करें