feat(client): add Pagination component and integrate with Table and pages

- add Pagination component with prev/next, ellipsis page range, and optional page-size selector
- add Pagination and Table pagination stories (WithPagination, WithPaginationAndSizeSelector)
- extend Table with optional pageSize and pageSizeOptions props for built-in client-side pagination
- add Timestamp column to Table story fixtures
- enable pagination on all four pages with pageSize=10 and size selector
- add pagination i18n keys to en.json
This commit is contained in:
2026-04-09 10:43:45 +03:00
parent b4d576c6e9
commit 077cd6ad5f
11 changed files with 358 additions and 35 deletions
@@ -0,0 +1,88 @@
.root {
display: flex;
align-items: center;
gap: var(--space-3);
padding: var(--space-2) var(--space-4);
border-top: var(--border-width) solid var(--color-border);
font-size: var(--font-size-xs);
color: var(--color-text-muted);
flex-wrap: wrap;
}
.info {
flex: 1;
white-space: nowrap;
}
.pages {
display: flex;
align-items: center;
gap: var(--space-1);
}
.pageBtn,
.arrow {
display: inline-flex;
align-items: center;
justify-content: center;
min-width: 28px;
height: 28px;
padding: 0 var(--space-1);
border: var(--border-width) solid transparent;
border-radius: var(--radius-sm);
background: transparent;
color: var(--color-text);
font-size: var(--font-size-xs);
font-family: var(--font-family);
cursor: pointer;
transition: background var(--transition), border-color var(--transition), color var(--transition);
line-height: 1;
}
.pageBtn:hover:not(:disabled),
.arrow:hover:not(:disabled) {
background: var(--color-bg);
border-color: var(--color-border);
}
.pageBtn.active {
background: var(--color-primary);
color: var(--color-primary-fg);
border-color: var(--color-primary);
font-weight: 700;
cursor: default;
}
.arrow:disabled {
opacity: 0.35;
cursor: not-allowed;
}
.ellipsis {
display: inline-flex;
align-items: center;
justify-content: center;
min-width: 24px;
height: 28px;
color: var(--color-text-muted);
font-size: var(--font-size-xs);
user-select: none;
}
.sizeSelect {
height: 28px;
padding: 0 var(--space-2);
border: var(--border-width) solid var(--color-border);
border-radius: var(--radius-sm);
background: var(--color-bg-subtle);
color: var(--color-text);
font-size: var(--font-size-xs);
font-family: var(--font-family);
cursor: pointer;
outline: none;
transition: border-color var(--transition);
}
.sizeSelect:focus {
border-color: var(--color-primary);
}