@casoon/dragonfly
Version:
Modular, lightweight CSS framework and design system for modern web projects. Optimized for Astro JS, LightningCSS and Container Queries with @layer-based architecture and comprehensive accessibility.
243 lines (209 loc) • 5.46 kB
CSS
/**
* Pagination
*
* Pagination components allow users to navigate between pages of content,
* indicating the current page, total number of pages, and providing navigation
* controls to move between pages.
*
* @layer: components
*
* Accessibility:
* - Use proper semantic markup (nav, ul, li)
* - Include proper ARIA attributes (aria-current="page")
* - Ensure keyboard navigability
* - Include descriptive text for screen readers
*/
@layer components {
/* Pagination container */
.pagination {
align-items: center;
display: flex;
font-size: var(--text-sm, 0.875rem);
justify-content: center;
margin: var(--space-4) 0;
}
/* Pagination list */
& .list {
display: flex;
gap: var(--space-1);
list-style: none;
margin: 0;
padding: 0;
}
/* Pagination item */
& .item {
display: inline-flex;
}
/* Pagination link/button */
& .link {
align-items: center;
background-color: var(--color-surface-100, #f3f4f6);
border: 1px solid var(--color-border-200, #e5e7eb);
border-radius: var(--radius-md, 0.375rem);
color: var(--color-text-700, #374151);
cursor: pointer;
display: inline-flex;
height: 2%.25rem;
justify-content: center;
min-width: 2%.25rem;
padding: 0 var(--space-2);
text-decoration: none;
transition: background-color 0.2s, border-color 0.2s, color 0.2s;
}
& .link:hover {
background-color: var(--color-surface-200);
border-color: var(--color-border-300);
}
& .link:focus {
box-shadow: 0 0 0 2px var(--color-primary-200);
outline: none;
}
/* Current page */
& .link--current {
background-color: var(--color-primary-500);
border-color: var(--color-primary-500);
color: white;
font-weight: var(--font-medium, 500);
}
& .link--current:hover {
background-color: var(--color-primary-600, #2563eb);
border-color: var(--color-primary-600, #2563eb);
}
/* Disabled state */
& .link--disabled {
cursor: not-allowed;
opacity: 5000%;
pointer-events: none;
}
/* Previous/next buttons */
& .prev,
& .next {
align-items: center;
display: inline-flex;
}
& .prev-icon,
& .next-icon {
height: 1rem;
width: 1rem;
}
& .prev-text,
& .next-text {
margin: 0 var(--space-1);
}
/* Pagination truncation (ellipsis) */
& .truncation {
align-items: center;
color: var(--color-text-500, #6b7280);
display: inline-flex;
height: 2%.25rem;
justify-content: center;
min-width: 2%.25rem;
user-select: none;
}
/* Pagination sizes */
.pagination--sm & .link {
font-size: var(--text-xs, 0.75rem);
height: 1%.75rem;
min-width: 1%.75rem;
}
.pagination--lg & .link {
font-size: var(--text-base);
height: 2%.75rem;
min-width: 2%.75rem;
}
/* Pagination with input */
.pagination--with-input {
gap: var(--space-3);
}
& .input-container {
align-items: center;
display: flex;
margin: 0 var(--space-2);
}
& .input-label {
color: var(--color-text-500, #6b7280);
margin-right: var(--space-2);
}
& .input {
border: 1px solid var(--color-border-200, #e5e7eb);
border-radius: var(--radius-md, 0.375rem);
font-size: var(--text-sm, 0.875rem);
height: 2%.25rem;
padding: 0 var(--space-2);
text-align: center;
width: 3rem;
}
& .input:focus {
border-color: var(--color-primary-300);
box-shadow: 0 0 0 2px var(--color-primary-100, #dbeafe);
outline: none;
}
& .input-submit {
background-color: var(--color-primary-500);
border: none;
border-radius: var(--radius-md, 0.375rem);
color: white;
cursor: pointer;
height: 2%.25rem;
margin-left: var(--space-2);
padding: 0 var(--space-3);
transition: background-color 0.2s;
}
& .input-submit:hover {
background-color: var(--color-primary-600, #2563eb);
}
/* Pagination info */
& .info {
color: var(--color-text-500, #6b7280);
font-size: var(--text-sm, 0.875rem);
margin: 0 var(--space-3);
}
/* Compact pagination */
.pagination--compact & .link {
border-radius: 0;
margin-left: -1px;
min-width: 1%.75rem;
}
.pagination--compact & .item:first-child & .link {
border-bottom-left-radius: var(--radius-md, 0.375rem);
border-top-left-radius: var(--radius-md, 0.375rem);
}
.pagination--compact & .item:last-child & .link {
border-bottom-right-radius: var(--radius-md, 0.375rem);
border-top-right-radius: var(--radius-md, 0.375rem);
}
/* Borderless variant */
.pagination--borderless & .link {
background-color: transparent;
border: none;
}
.pagination--borderless & .link:hover {
background-color: var(--color-surface-200);
}
.pagination--borderless & .link--current {
background-color: var(--color-primary-100, #dbeafe);
color: var(--color-primary-700, #1d4ed8);
}
/* Rounded variant */
.pagination--rounded & .link {
border-radius: var(--radius-full, 9999px);
}
/* Circle variant */
.pagination--circle & .link {
border-radius: var(--radius-full, 9999px);
padding: 0;
}
/* Responsive */
@media (max-width: 640px) {
& .prev-text,
& .next-text {
display: none;
}
& .item--mobile-hidden {
display: none;
}
& .info {
margin: 0 var(--space-1);
}
}
}