Skip to content

@vibe-labs/design-components-pagination

Pagination component tokens, styles, and TypeScript types for the Vibe Design System.

Installation

css
@import "@vibe-labs/design-components-pagination";
ts
import type { PaginationStyleProps, PaginationItemStyleProps } from "@vibe-labs/design-components-pagination/types";

Contents

Tokens (pagination.css)

CSS custom properties defined in @layer vibe.tokens:

TokenDefaultDescription
--pagination-gap--space-1Gap between items
--pagination-item-size2remMin width and height
--pagination-item-radius--radius-mdBorder radius
--pagination-item-font-size--text-smFont size
--pagination-item-font-weight400Default weight
--pagination-item-color--text-secondaryText color
--pagination-item-bgtransparentBackground
--pagination-item-hover-bg--surface-hover-overlayHover background
--pagination-item-active-bg--color-accentActive page background
--pagination-item-active-color--color-accent-contrastActive page text
--pagination-item-active-font-weight--font-semiboldActive page weight
--pagination-item-disabled-opacity--input-disabled-opacityDisabled opacity
--pagination-ellipsis-color--text-mutedEllipsis color

Generated Styles (pagination.g.css)

Component classes generated into @layer vibe.components.

Elements

  • pagination — flex row container, reset list styles
  • pagination-item — interactive page button with hover/active/focus/disabled states. aria-current marks the active page (accent bg, contrast text, no pointer)
  • pagination-ellipsis — non-interactive placeholder

TypeScript Types (types/)

ts
interface PaginationStyleProps {}
interface PaginationItemStyleProps {
  disabled?: boolean;
}
interface PaginationEllipsisStyleProps {}

Dist Structure

FileDescription
index.cssBarrel — imports tokens + generated styles
pagination.cssToken definitions
pagination.g.cssGenerated component styles
index.js / index.d.tsTypeScript types + runtime constants

Dependencies

Requires tokens from @vibe-labs/design (colors, surfaces, spacing, typography, transitions, elevation).

Build

bash
npm run build

Usage Guide

Import

css
@import "@vibe-labs/design-components-pagination";
ts
import type { PaginationItemStyleProps } from "@vibe-labs/design-components-pagination/types";

Variants

Attribute / StateValuesNotes
aria-current="page"on itemMarks active page (accent bg)
disabledboolean attrReduced opacity, pointer-events: none

No data-variant or data-size — styling is controlled by tokens only.

Examples

Basic pagination

html
<nav aria-label="Pagination">
  <ul class="pagination">
    <li><button class="pagination-item" aria-label="Previous">‹</button></li>
    <li><button class="pagination-item">1</button></li>
    <li><button class="pagination-item" aria-current="page">2</button></li>
    <li><button class="pagination-item">3</button></li>
    <li><button class="pagination-item" aria-label="Next">›</button></li>
  </ul>
</nav>

With ellipsis

html
<nav aria-label="Pagination">
  <ul class="pagination">
    <li><button class="pagination-item" aria-label="Previous">‹</button></li>
    <li><button class="pagination-item">1</button></li>
    <li><span class="pagination-ellipsis">…</span></li>
    <li><button class="pagination-item">4</button></li>
    <li><button class="pagination-item" aria-current="page">5</button></li>
    <li><button class="pagination-item">6</button></li>
    <li><span class="pagination-ellipsis">…</span></li>
    <li><button class="pagination-item">12</button></li>
    <li><button class="pagination-item" aria-label="Next">›</button></li>
  </ul>
</nav>

With disabled prev/next

html
<nav aria-label="Pagination">
  <ul class="pagination">
    <li><button class="pagination-item" disabled aria-label="Previous">‹</button></li>
    <li><button class="pagination-item" aria-current="page">1</button></li>
    <li><button class="pagination-item">2</button></li>
    <li><button class="pagination-item">3</button></li>
    <li><button class="pagination-item" aria-label="Next">›</button></li>
  </ul>
</nav>

First/last page buttons

html
<nav aria-label="Pagination">
  <ul class="pagination">
    <li><button class="pagination-item" aria-label="First page">«</button></li>
    <li><button class="pagination-item" aria-label="Previous">‹</button></li>
    <li><button class="pagination-item" aria-current="page">5</button></li>
    <li><button class="pagination-item" aria-label="Next">›</button></li>
    <li><button class="pagination-item" aria-label="Last page">»</button></li>
  </ul>
</nav>

With Vue

vue
<template>
  <nav aria-label="Pagination">
    <ul class="pagination">
      <li v-for="item in pages" :key="item.value">
        <span v-if="item.ellipsis" class="pagination-ellipsis">…</span>
        <button
          v-else
          class="pagination-item"
          :aria-current="item.value === currentPage ? 'page' : undefined"
          :disabled="item.disabled"
          @click="$emit('change', item.value)"
        >
          {{ item.label }}
        </button>
      </li>
    </ul>
  </nav>
</template>

Vibe