Pagination Nav
A pagination nav is a navigation container for page navigation links, allowing users to move between pages of content such as search results, product listings, or data tables. It renders as a <nav> element with an aria-label, providing a navigation landmark that can be identified by assistive technologies. The component contains a PaginationList with PaginationListItem children for individual page links.
Example
Show demo markup
<nav class="pagination-nav" aria-label="Pagination"><ol class="pagination-list"><li class="pagination-list-item"><a class="pagination-link" href="#" aria-current="page">1</a></li><li class="pagination-list-item"><a class="pagination-link" href="#">2</a></li><li class="pagination-list-item"><a class="pagination-link" href="#">3</a></li></ol></nav>
Usage example
<script lang="ts">
import PaginationNav from './PaginationNav.svelte';
import PaginationList from '../PaginationList/PaginationList.svelte';
import PaginationListItem from '../PaginationListItem/PaginationListItem.svelte';
</script>
<PaginationNav label="Pagination">
<PaginationList label="Results pages">
<PaginationListItem><a href="/page/1">Previous</a></PaginationListItem>
<PaginationListItem><a href="/page/1">1</a></PaginationListItem>
<PaginationListItem><a href="/page/2" aria-current="page">2</a></PaginationListItem>
<PaginationListItem><a href="/page/3">3</a></PaginationListItem>
<PaginationListItem><a href="/page/3">Next</a></PaginationListItem>
</PaginationList>
</PaginationNav>
Show Svelte source
// In your Svelte component:
import PaginationNav from "lily-design-system-svelte-headless/components/PaginationNav/PaginationNav.svelte";
<PaginationNav label="Navigation">
<!-- nav children -->
</PaginationNav>
Usage
Previous/next style pagination for a series of related content pages, such as a multi-page health condition guide:
<PaginationNav label="Pagination">
<PaginationList>
<PaginationListItem>
<PaginationLink href="/conditions/diabetes/symptoms" rel="prev">
Previous: Symptoms
</PaginationLink>
</PaginationListItem>
<PaginationListItem>
<PaginationLink href="/conditions/diabetes/treatment" rel="next">
Next: Treatment
</PaginationLink>
</PaginationListItem>
</PaginationList>
</PaginationNav>
Numbered pagination for search results, with aria-current="page" on the active page:
<PaginationNav label="Search results pages">
<PaginationList>
<PaginationListItem>
<PaginationLink href="/results?page=1" label="Page 1">1</PaginationLink>
</PaginationListItem>
<PaginationListItem>
<PaginationLink href="/results?page=2" label="Page 2" aria-current="page">2</PaginationLink>
</PaginationListItem>
<PaginationListItem>
<PaginationLink href="/results?page=3" label="Page 3">3</PaginationLink>
</PaginationListItem>
</PaginationList>
</PaginationNav>
Props
label: string (required) -- accessible name for the navigation landmark via aria-label
children: slot (required) -- PaginationList with page navigation items
...restProps: any -- additional HTML attributes spread onto the <nav> element
Keyboard Interactions
- Tab: Moves focus between pagination links within the navigation
- Enter: Activates the focused link to navigate to that page
ARIA
<nav aria-label="..."> -- creates a navigation landmark with a descriptive label for the pagination region
- Consumer applies
aria-current="page" on the link representing the current page
When to Use
- Use at the bottom of a page when content is split across multiple related pages to help users navigate forwards and backwards
- Use when showing all content on a single page would make it too long to load or read
- Use with ContentsNav at the top of the page as a mini-hub navigation pattern
- Use instead of infinite scroll, which creates problems for keyboard users
When Not to Use
- Do not use for unrelated pages that are not part of a grouped series -- use standard navigation links instead
- Do not use for navigating through multi-page forms -- use Button ("Continue") with BackLink instead
- Do not use when there is only one page of content -- omit pagination entirely
- Do not use for in-page section navigation -- use ContentsNav instead
Headless
This headless component provides a <nav> element with aria-label for navigation landmark identification. The consumer provides all visual styling, including layout, positioning, and responsive behavior of the pagination region.
Styles
The consumer provides all CSS styling. The component renders with a .pagination-nav class for targeting. No default styles are included — this is a fully headless component.
Testing
- Verify the component renders a
<nav> element with class pagination-nav
- Verify <nav aria-label="...">` -- creates a navigation landmark with a descriptive label for the pagination region
- Verify keyboard interactions work correctly
- Verify pass-through attributes are applied
Advice
- Designers: Position pagination consistently (typically below the content it paginates) and ensure it is visible without scrolling.
- Developers: Use a unique
aria-label (e.g., "Search results pages") to distinguish this navigation from other <nav> landmarks on the page. Nest PaginationList inside.
Implementation Notes
- Renders as a
<nav> element to create a navigation landmark for pagination controls
- The
label prop sets aria-label to distinguish this navigation region from other <nav> elements on the page
- Consumer provides a PaginationList with PaginationListItem children inside the nav
- Spreads
...restProps onto the <nav> element for consumer customization
- No internal state -- purely a structural wrapper providing the navigation landmark
Composition
PaginationNav is the outermost component in the pagination compound pattern. It contains PaginationList, which contains PaginationListItem children.
PaginationNav (nav) → PaginationList (nav + ul) → PaginationListItem (li)
Related components
pagination-list — an ordered list of pagination list items
pagination-list-item — one pagination list item in the trail
pagination-link — one pagination link in the trail
References
- WAI-ARIA Navigation Role: https://www.w3.org/TR/wai-aria-1.2/#navigation
- WAI-ARIA Practices - Navigation: https://www.w3.org/WAI/ARIA/apg/patterns/navigation/
Canonical contract
Generated from this component's canonical metadata — the machine-checked source the implementations are held to.
Metadata
- Component: pagination-nav
- PascalCase: PaginationNav
- Description: an ordered list of page navigation links
- Status: stable — exercised in composed page flows under e2e and axe, beyond the per-component checks
- HTML tag: <nav>
- CSS class: .pagination-nav
- Interactive: yes
ARIA
<nav aria-label="..."> -- creates a navigation landmark with a descriptive label for the pagination region - Consumer applies
aria-current="page" on the link representing the current page
Keyboard
- Tab: Moves focus between pagination links within the navigation
- Enter: Activates the focused link to navigate to that page
Props
label: string (required) -- accessible name for the navigation landmark via aria-label children: slot (required) -- PaginationList with page navigation items ...restProps: any -- additional HTML attributes spread onto the <nav> element