Search for a command to run...
Pagination with page navigation, next and previous links.
npx shadcn@latest add @zaidan/paginationpnpx shadcn add @zaidan/paginationyarn dlx shadcn@latest add @zaidan/paginationbunx shadcn@latest add @zaidan/paginationCopy and paste the following code into your project.
1import { ChevronLeft, ChevronRight, Ellipsis } from "lucide-solid";2import type { ComponentProps } from "solid-js";3import { mergeProps, splitProps } from "solid-js";4
5import { cn } from "~/lib/utils";6import { Button, type ButtonProps } from "~/components/ui/button";7
8type PaginationProps = ComponentProps<"nav">;9
10const Pagination = (props: PaginationProps) => {11 const [local, others] = splitProps(props, ["class"]);12 return (13 <nav14 aria-label="pagination"15 data-slot="pagination"16 class={cn("z-pagination mx-auto flex w-full justify-center", local.class)}17 {...others}18 />19 );20};21
22type PaginationContentProps = ComponentProps<"ul">;23
24const PaginationContent = (props: PaginationContentProps) => {25 const [local, others] = splitProps(props, ["class"]);26 return (27 <ul28 data-slot="pagination-content"29 class={cn("z-pagination-content flex items-center", local.class)}30 {...others}31 />32 );33};34
35type PaginationItemProps = ComponentProps<"li">;36
37const PaginationItem = (props: PaginationItemProps) => {38 return <li data-slot="pagination-item" {...props} />;39};40
41type PaginationLinkProps = {42 isActive?: boolean;43} & Pick<ButtonProps, "size"> &44 ComponentProps<"a">;45
46const PaginationLink = (props: PaginationLinkProps) => {47 const mergedProps = mergeProps({ size: "icon" } as PaginationLinkProps, props);48 const [local, others] = splitProps(mergedProps, ["class", "isActive", "size"]);49 return (50 <Button51 as="a"52 variant={local.isActive ? "outline" : "ghost"}53 size={local.size}54 class={cn("z-pagination-link", local.class)}55 aria-current={local.isActive ? "page" : undefined}56 data-slot="pagination-link"57 data-active={local.isActive}58 {...others}59 />60 );61};62
63type PaginationPreviousProps = ComponentProps<typeof PaginationLink>;64
65const PaginationPrevious = (props: PaginationPreviousProps) => {66 const [local, others] = splitProps(props, ["class", "children"]);67 return (68 <PaginationLink69 aria-label="Go to previous page"70 size="default"71 class={cn("z-pagination-previous", local.class)}72 {...others}73 >74 <ChevronLeft data-icon="inline-start" />75 <span class="z-pagination-previous-text hidden sm:block">Previous</span>76 </PaginationLink>77 );78};79
80type PaginationNextProps = ComponentProps<typeof PaginationLink>;81
82const PaginationNext = (props: PaginationNextProps) => {83 const [local, others] = splitProps(props, ["class", "children"]);84 return (85 <PaginationLink86 aria-label="Go to next page"87 size="default"88 class={cn("z-pagination-next", local.class)}89 {...others}90 >91 <span class="z-pagination-next-text hidden sm:block">Next</span>92 <ChevronRight data-icon="inline-end" />93 </PaginationLink>94 );95};96
97type PaginationEllipsisProps = ComponentProps<"span">;98
99const PaginationEllipsis = (props: PaginationEllipsisProps) => {100 const [local, others] = splitProps(props, ["class"]);101 return (102 <span103 aria-hidden104 data-slot="pagination-ellipsis"105 class={cn("z-pagination-ellipsis flex items-center justify-center", local.class)}106 {...others}107 >108 <Ellipsis />109 <span class="sr-only">More pages</span>110 </span>111 );112};113
114export {115 Pagination,116 PaginationContent,117 PaginationEllipsis,118 PaginationItem,119 PaginationLink,120 PaginationNext,121 PaginationPrevious,122};By default, the <PaginationLink /> component will render an <a> element. You can use the as prop to render a different component, such as a SolidJS Router <A> component.
import { A } from "@solidjs/router";import { PaginationLink } from "~/components/ui/pagination";1<PaginationLink as={A} href="/page/2">2 23</PaginationLink>Here are the source code of all the examples from the preview page:
import { Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious,} from "~/components/ui/pagination";function PaginationBasic() { return ( <Example title="Basic"> <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> </Example> );}import { Pagination, PaginationContent, PaginationItem, PaginationLink,} from "~/components/ui/pagination";function PaginationSimple() { return ( <Example title="Simple"> <Pagination> <PaginationContent> <PaginationItem> <PaginationLink href="#">1</PaginationLink> </PaginationItem> <PaginationItem> <PaginationLink href="#" isActive> 2 </PaginationLink> </PaginationItem> <PaginationItem> <PaginationLink href="#">3</PaginationLink> </PaginationItem> <PaginationItem> <PaginationLink href="#">4</PaginationLink> </PaginationItem> <PaginationItem> <PaginationLink href="#">5</PaginationLink> </PaginationItem> </PaginationContent> </Pagination> </Example> );}import { Pagination, PaginationContent, PaginationItem, PaginationNext, PaginationPrevious,} from "~/components/ui/pagination";import { Field, FieldLabel } from "~/components/ui/field";import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue,} from "~/components/ui/select";function PaginationIconsOnly() { const items = [ { value: "10", label: "10" }, { value: "25", label: "25" }, { value: "50", label: "50" }, { value: "100", label: "100" }, ];
return ( <Example title="With Select"> <div class="flex items-center justify-between gap-4"> <Field orientation="horizontal" class="w-fit"> <FieldLabel for="select-rows-per-page">Rows per page</FieldLabel> <Select<(typeof items)[number]> options={items} optionValue="value" optionTextValue="label" defaultValue={items[1]} itemComponent={(props) => ( <SelectItem item={props.item}>{props.item.rawValue.label}</SelectItem> )} > <SelectTrigger class="w-20" id="select-rows-per-page"> <SelectValue<(typeof items)[number]>> {(state) => state.selectedOption().label} </SelectValue> </SelectTrigger> <SelectContent /> </Select> </Field> <Pagination class="mx-0 w-auto"> <PaginationContent> <PaginationItem> <PaginationPrevious href="#" /> </PaginationItem> <PaginationItem> <PaginationNext href="#" /> </PaginationItem> </PaginationContent> </Pagination> </div> </Example> );}