Pagination
A navigation component that displays page numbers and controls for moving between pages.
Loading...
<twig:Pagination> <twig:Pagination:Content> <twig:Pagination:Item> <twig:Pagination:Previous href="#" /> </twig:Pagination:Item> <twig:Pagination:Item> <twig:Pagination:Link href="#">1</twig:Pagination:Link> </twig:Pagination:Item> <twig:Pagination:Item> <twig:Pagination:Link href="#" active>2</twig:Pagination:Link> </twig:Pagination:Item> <twig:Pagination:Item> <twig:Pagination:Link href="#">3</twig:Pagination:Link> </twig:Pagination:Item> <twig:Pagination:Item> <twig:Pagination:Ellipsis /> </twig:Pagination:Item> <twig:Pagination:Item> <twig:Pagination:Next href="#" /> </twig:Pagination:Item> </twig:Pagination:Content> </twig:Pagination>
Installation
Ensure the Symfony UX Toolkit is installed in your Symfony app:
$ composer require --dev symfony/ux-toolkit
Then, run the following command to install the component and its dependencies:
$ bin/console ux:install pagination --kit shadcn
The UX Toolkit is not mandatory to install a component. You can install it manually by following the next steps:
- Copy the following file(s) into your Symfony app:
templates/components/Pagination.html.twig{# @block content The default block #} <nav class="{{ 'mx-auto flex w-full justify-center ' ~ attributes.render('class')|tailwind_merge }}" role="navigation" {{ attributes }} > {%- block content %}{% endblock -%} </nav>
templates/components/Pagination/Content.html.twig{# @block content The default block #} <ul {{ attributes.without('class') }} class="{{ 'flex flex-row items-center gap-1 ' ~ attributes.render('class')|tailwind_merge }}" > {%- block content %}{% endblock -%} </ul>
templates/components/Pagination/Ellipsis.html.twig<span aria-hidden="true" class="{{ 'flex size-9 items-center justify-center ' ~ attributes.render('class')|tailwind_merge }}" {{ attributes.without('class') }} > <twig:ux:icon name="lucide:more-horizontal" class="size-4" /> <span class="sr-only">More pages</span> </span>
templates/components/Pagination/Item.html.twig{# @block content The default block #} <li{{ attributes }}> {%- block content %}{% endblock -%} </li>
templates/components/Pagination/Link.html.twig{# @prop active boolean Whether the link is active or not, default to `false` #} {# @block content The default block #} {%- props active = false -%} <twig:Button as="a" variant="{{ active ? 'outline' : 'ghost' }}" size="icon" aria-current="{{ active ? 'page' : false }}" href="#" {{ ...attributes.without('class') }} > {{- block(outerBlocks.content) -}} </twig:Button>
templates/components/Pagination/Next.html.twig<twig:Pagination:Link aria-label="Go to next page" size="default" class="{{ 'gap-1 pr-2.5 ' ~ attributes.render('class')|tailwind_merge }}" {{ ...attributes.without('class') }} > <span>Next</span> <twig:ux:icon name="lucide:chevron-right" class="size-4" /> </twig:Pagination:Link>
templates/components/Pagination/Previous.html.twig<twig:Pagination:Link aria-label="Go to previous page" size="default" class="{{ 'gap-1 pl-2.5 ' ~ attributes.render('class')|tailwind_merge }}" {{ ...attributes.without('class') }} > <twig:ux:icon name="lucide:chevron-left" class="size-4" /> <span>Previous</span> </twig:Pagination:Link>
- If necessary, install the following Composer dependencies:
$ composer require symfony/ux-icons tales-from-a-dev/twig-tailwind-extra:^1.0.0
- And the most important, enjoy!
Usage
<twig:Pagination> <twig:Pagination:Content> <twig:Pagination:Item> <twig:Pagination:Previous href="#" /> </twig:Pagination:Item> <twig:Pagination:Item> <twig:Pagination:Link href="#">1</twig:Pagination:Link> </twig:Pagination:Item> <twig:Pagination:Item> <twig:Pagination:Link href="#" active>2</twig:Pagination:Link> </twig:Pagination:Item> <twig:Pagination:Item> <twig:Pagination:Link href="#">3</twig:Pagination:Link> </twig:Pagination:Item> <twig:Pagination:Item> <twig:Pagination:Ellipsis /> </twig:Pagination:Item> <twig:Pagination:Item> <twig:Pagination:Next href="#" /> </twig:Pagination:Item> </twig:Pagination:Content> </twig:Pagination>
Examples
Default
Loading...
<twig:Pagination> <twig:Pagination:Content> <twig:Pagination:Item> <twig:Pagination:Previous href="#" /> </twig:Pagination:Item> <twig:Pagination:Item> <twig:Pagination:Link href="#">1</twig:Pagination:Link> </twig:Pagination:Item> <twig:Pagination:Item> <twig:Pagination:Link href="#" active>2</twig:Pagination:Link> </twig:Pagination:Item> <twig:Pagination:Item> <twig:Pagination:Link href="#">3</twig:Pagination:Link> </twig:Pagination:Item> <twig:Pagination:Item> <twig:Pagination:Ellipsis /> </twig:Pagination:Item> <twig:Pagination:Item> <twig:Pagination:Next href="#" /> </twig:Pagination:Item> </twig:Pagination:Content> </twig:Pagination>
Symmetric
Loading...
<twig:Pagination> <twig:Pagination:Content> <twig:Pagination:Item> <twig:Pagination:Previous href="#" /> </twig:Pagination:Item> <twig:Pagination:Item> <twig:Pagination:Link href="#">1</twig:Pagination:Link> </twig:Pagination:Item> <twig:Pagination:Item> <twig:Pagination:Ellipsis /> </twig:Pagination:Item> <twig:Pagination:Item> <twig:Pagination:Link href="#">4</twig:Pagination:Link> </twig:Pagination:Item> <twig:Pagination:Item> <twig:Pagination:Link href="#" active>5</twig:Pagination:Link> </twig:Pagination:Item> <twig:Pagination:Item> <twig:Pagination:Link href="#">6</twig:Pagination:Link> </twig:Pagination:Item> <twig:Pagination:Item> <twig:Pagination:Ellipsis /> </twig:Pagination:Item> <twig:Pagination:Item> <twig:Pagination:Link href="#">9</twig:Pagination:Link> </twig:Pagination:Item> <twig:Pagination:Item> <twig:Pagination:Next href="#" /> </twig:Pagination:Item> </twig:Pagination:Content> </twig:Pagination>
API Reference
Pagination
| Block | Description |
|---|---|
content |
The default block |
Pagination:Content
| Block | Description |
|---|---|
content |
The default block |
Pagination:Item
| Block | Description |
|---|---|
content |
The default block |
Pagination:Link
| Prop | Type | Description |
|---|---|---|
active |
boolean |
Whether the link is active or not, default to false |
| Block | Description |
|---|---|
content |
The default block |