Skip to content

Pagination

Controlled page/page-count context with normalized boundaries and type-enforced page/prev/next items.

  • Category: Navigation & disclosure
  • Status: stable public Registry/export-map component family
  • Targets: iOS · Android · Web, subject to the compatibility contract
  • Prerequisites: @beemvp/beeui-ui installed (or this component’s source copied via the Registry CLI below) and, on Web, the BeeUI Tailwind/Uniwind theme CSS loaded — see Start for full platform setup.
  • Source: packages/ui/src/components/pagination.tsx
import { Pagination, PaginationItem } from '@beemvp/beeui-ui';

There is no documented deep/private source import. For source ownership from a BeeUI checkout:

Terminal window
pnpm beeui add pagination

Registry (used throughout this page) is BeeUI’s source-ownership manifest — registry/registry.json — that the pnpm beeui/@beemvp/beeui-cli CLI reads to copy a component’s real source into your app and rewrite its internal imports; it is not an npm package index. This component’s own Registry entry: registry/registry.json.

  • Family exports: Pagination PaginationItem
    • Also routed here, outside the Registry family:
      • pagination
    • Package export subpath: @beemvp/beeui-ui/pagination

Exported types: PaginationItemProps, PaginationItemType, PaginationProps

The generated API inventory is mechanically joined to packages/ui/src/index.ts, Registry metadata, and the component reference contract. Each type’s field table below is parsed directly from that source, not a second hand-maintained copy; for the fuller behavior narrative see the canonical component behavior catalog.

Controlled page/onPageChange context shared with every PaginationItem; page boundaries are normalized (out-of-range requests are clamped), and a malformed runtime page item (e.g. a type="page" item with no page number) fails safe as disabled.

one of the following mutually exclusive variants:

Variant PaginationPageItemProps:

Prop Type Default Description
children React.ReactNode — Content rendered inside this element. The family’s composition section states which children it expects.
className string — Extra utility classes, merged after the component’s own via cn(...), so they win on conflict. An escape hatch for source-owned and application work, not a cross-engine portability guarantee.
labelClassName string — Extra utility classes for the label text specifically, merged after the component’s own.
page (required) number — Page number this item targets, starting at 1 and truncated toward zero; a non-finite value renders the item as a disabled em dash. An item whose target falls outside [1, pageCount] is also disabled.
type 'page' 'page' Marks this item as a page numeral rather than a navigation arrow, and renders selected when its page is the current page. Defaults to 'page'.

Also carries every prop of Omit<PressableProps, 'accessibilityRole' | 'children' | 'role'> — that upstream contract is not reproduced here.

Variant PaginationNavigationItemProps:

Prop Type Default Description
children React.ReactNode — Content rendered inside this element. The family’s composition section states which children it expects.
className string — Extra utility classes, merged after the component’s own via cn(...), so they win on conflict. An escape hatch for source-owned and application work, not a cross-engine portability guarantee.
labelClassName string — Extra utility classes for the label text specifically, merged after the component’s own.
page never — Not accepted on a navigation item, whose target is derived from the current page: one before it for 'previous', one after it for 'next'.
type (required) 'previous' | 'next' 'page' Which navigation affordance to render, as a logical rather than physical direction, so 'previous' points toward the visual right in an RTL layout. The item is disabled when its derived target falls outside [1, pageCount].

Also carries every prop of Omit<PressableProps, 'accessibilityRole' | 'children' | 'role'> — that upstream contract is not reproduced here.

Prop Type Default Description
children React.ReactNode — Content rendered inside this element. The family’s composition section states which children it expects.
className string — Extra utility classes, merged after the component’s own via cn(...), so they win on conflict. An escape hatch for source-owned and application work, not a cross-engine portability guarantee.
disabled boolean false Disables every PaginationItem inside, overriding each item’s own disabled. Defaults to false.
onPageChange (page: number) => void — Called with the requested page number when a non-selected, in-range PaginationItem is pressed. Not called for the currently selected page or an out-of-range target.
page (required) number — The current page, clamped to [1, pageCount]. Non-finite values fall back to 1.
pageCount (required) number — Total number of pages. Non-finite or sub-1 values are floored and clamped to at least 1.

Also carries every prop of Omit<ViewProps, 'children' | 'role'> — that upstream contract is not reproduced here.

Related exported types:

  • PaginationItemType — one of 'page', 'previous', 'next'.

The executable fixtures below are the source-grounded usage examples; consumers should not infer state ownership from DOM structure or another UI library.

  • No additional provider is required by this family. BeeUIProvider remains the recommended application root.
  • Peer/native dependencies visible to this Registry item: react, react-native
  • Registry dependency closure: core-cn, text, theme, use-direction
  • Safe-area ownership remains explicit: shell surfaces touching system edges opt into SafeArea; components do not silently invent app-shell insets.
  • Web consumers load the BeeUI semantic theme CSS as documented in Web onboarding.

This family ships no platform-specific file, and its own source takes no Platform branch.

The same public family is exposed across the supported target matrix; meaningful platform differences remain governed by the compatibility contract.

Evidence classes are not equal and this page does not blur them: Web behavior is exercised in a real browser, while iOS and Android carry package/export and native-compile evidence, which is not device-runtime proof. The compatibility contract records which class each claim rests on.

  • Roles this family assigns: button — set in pagination.tsx by the components themselves, not by the caller.
  • Accessibility states and properties it sets: accessibilityLabel, current, disabled, selected — read from pagination.tsx.

Keyboard/focus behavior, announcements, Dynamic Type/Web zoom, RTL and reduced-motion expectations are not derived here — see Accessibility overview, Keyboard & focus, RTL/localization and Large text & zoom. BeeUI does not claim universal accessibility certification from automated tests.

  • Style axes: none of its own — its appearance comes from tokens and your own classes; it also carries Omit<ViewProps, 'children' | 'role'>.
  • Class-name surfaces: className, labelClassName.

Colors, spacing and typography come from semantic tokens rather than from values written here — see Theming and Density. A className is an escape hatch for source-owned and application work, not a cross-engine portability guarantee.

Each link below opens the Showcase at that exact example, not at the top of the gallery:

  • basic — smallest meaningful complete usage
  • states — the states example

The Showcase links demonstrate Web behavior; use the native-preview guide for real simulator/emulator/device paths.

This frame loads the real BeeUI Web Showcase on demand; it is not a second docs-only implementation. It proves browser behavior only. Use native preview for iOS/Android simulator, emulator or device paths.

  • Family root / primary export: Pagination
    • Public composition parts / helpers:
      • PaginationItem
    • Exported type surface:
      • PaginationItemProps
      • PaginationItemType
      • PaginationProps

The tree above is ordinary document structure so it remains readable with keyboard and assistive technology; it is derived from the real public export family rather than a canvas-only diagram.

These are the parts of the typechecked runtime Showcase fixture behind this live preview — apps/showcase/component-gallery/component-gallery.tsx, 1103 lines — where Pagination is actually used: 8 lines in 1 place. Each block is copied verbatim from the line range named above it, so it is the same executable source, not a retelling of it. The rest of that file exercises other families and is not reproduced here.

Imports the examples below need (a filtered subset of the fixture’s own top-level imports):

import { Pagination, PaginationItem } from '@beemvp/beeui-ui';
import * as React from 'react';

Fixture state this block reads (same file, line 467):

const [page, setPage] = React.useState(2);

lines 932–939:

<Pagination onPageChange={setPage} page={page} pageCount={4}>
<PaginationItem testID="pagination-previous" type="previous" />
<PaginationItem page={1} />
<PaginationItem page={2} />
<PaginationItem page={3} />
<PaginationItem page={4} />
<PaginationItem type="next" />
</Pagination>

Open the fixture itself for the full surrounding component. For a smaller app-specific example, start from the imports and fixture-state blocks above and keep only the state your screen owns.

The container renders no items of its own and has no page-window or ellipsis logic — the caller composes every PaginationItem, and an item throws when rendered outside a Pagination. An item’s default accessible names are English literals; only a per-item accessibilityLabel overrides them.