bp/public/assets/css/modules/data-table.css

354 lines
8.2 KiB
CSS
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* DataTable - Универсальные стили для интерактивных таблиц
*
* Подключение: <link rel="stylesheet" href="/css/components/data-table.css">
*/
/* Основной контейнер таблицы */
.data-table {
width: 100%;
}
/* Интерактивные заголовки */
.data-table thead th {
vertical-align: middle;
white-space: nowrap;
padding: 0.5rem 0.75rem;
position: relative;
}
.data-table .header-content {
display: flex;
align-items: center;
gap: 8px;
width: 100%;
min-width: 0;
position: relative;
}
/* Текст заголовка */
.data-table .header-text {
cursor: pointer;
flex: 1 1 auto;
overflow: hidden;
text-overflow: ellipsis;
min-width: 0;
transition: color 0.2s ease;
white-space: nowrap;
}
.data-table .header-text:hover {
color: var(--bs-primary, #0d6efd);
}
/* Иконки в заголовке */
.data-table .search-trigger,
.data-table .sort-icon {
flex-shrink: 0;
}
.data-table .search-trigger {
cursor: pointer;
opacity: 0.5;
transition: opacity 0.2s ease, color 0.2s ease;
font-size: 0.875rem;
}
.data-table .search-trigger:hover {
opacity: 1;
color: var(--bs-primary, #0d6efd);
}
.data-table .sort-icon {
cursor: pointer;
transition: color 0.2s ease;
font-size: 0.875rem;
}
.data-table .sort-icon:hover {
color: var(--bs-primary, #0d6efd) !important;
}
.data-table .sort-icon.active {
color: var(--bs-primary, #0d6efd) !important;
}
/* Поле ввода - абсолютное позиционирование */
.data-table .header-search-input {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
font-size: 0.875rem;
padding: 0.25rem 0.5rem;
border: 1px solid transparent;
border-radius: 0.25rem;
background-color: #fff;
box-shadow: 0 0 0 2px rgba(var(--bs-primary-rgb, 13, 110, 253), 0.25);
z-index: 10;
display: none;
}
.data-table .header-search-input.visible {
display: block;
}
/* Скрываем элементы заголовка при активном поиске */
.data-table .header-search-input.visible ~ .search-trigger,
.data-table .header-search-input.visible ~ .header-text,
.data-table .header-search-input.visible ~ .sort-icon {
visibility: hidden;
}
/* Пагинация - исправленная структура */
.data-table .pagination-wrapper {
display: flex;
align-items: center;
justify-content: space-between;
flex-wrap: nowrap;
gap: 1rem;
padding: 0.75rem 1rem;
border-top: 1px solid var(--bs-border-color, #dee2e6);
width: 100%;
margin: 0;
background-color: #fff;
border-bottom-left-radius: 0.375rem;
border-bottom-right-radius: 0.375rem;
}
/* Информация слева */
.data-table .pagination-info {
font-size: 0.875rem;
color: var(--bs-secondary-color, #6c757d);
white-space: nowrap;
flex-shrink: 0;
margin: 0;
}
/* Навигация по центру */
.data-table .pagination-wrapper > nav.pagination {
flex: 1 1 auto;
display: flex;
justify-content: center;
margin: 0;
}
.data-table .pagination-wrapper > nav.pagination .pagination {
margin-bottom: 0;
flex-wrap: nowrap;
}
/* Селектор справа */
.data-table .per-page-selector {
display: flex;
align-items: center;
gap: 0.5rem;
flex-shrink: 0;
white-space: nowrap;
margin: 0;
}
/* Компактный селектор */
.data-table .per-page-selector .per-page-select,
.data-table .per-page-selector select {
appearance: none;
-webkit-appearance: none;
-moz-appearance: none;
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");
background-repeat: no-repeat;
background-position: right 0.5rem center;
background-size: 16px 12px;
padding-right: 2rem !important;
width: 80px !important;
font-size: 0.875rem !important;
padding: 0.25rem 0.5rem !important;
border: 1px solid #dee2e6;
border-radius: 0.25rem;
background-color: #fff;
cursor: pointer;
margin: 0;
}
/* Убираем отступы у ячейки футера */
.data-table tfoot td {
padding: 0 !important;
border-top: 1px solid var(--bs-border-color, #dee2e6);
}
/* Убираем границы у строки футера */
.data-table tfoot tr {
border: none;
}
/* Кнопки пагинации */
.data-table .page-link {
display: flex;
align-items: center;
justify-content: center;
min-width: 2rem;
height: 2rem;
padding: 0 0.5rem;
border-radius: 0.375rem;
font-size: 0.875rem;
text-decoration: none;
transition: all 0.2s ease;
margin: 0 0.125rem;
}
.data-table .page-link:hover:not(.disabled):not(.active) {
background-color: var(--bs-primary-bg-subtle, #e9ecef);
}
.data-table .page-link.active {
background-color: var(--bs-primary, #0d6efd);
color: #fff;
border-color: var(--bs-primary, #0d6efd);
}
.data-table .page-link.disabled {
color: var(--bs-secondary-color, #6c757d);
pointer-events: none;
opacity: 0.5;
}
/* Контейнер селектора не должен растягиваться */
.data-table .per-page-selector {
width: auto !important;
max-width: none !important;
flex-shrink: 0;
}
.data-table .per-page-selector label {
font-size: 0.875rem;
color: var(--bs-secondary-color, #6c757d);
margin-bottom: 0;
white-space: nowrap;
}
/* Стили для ячеек с действиями */
.data-table .actions-cell {
white-space: nowrap;
text-align: end;
}
.data-table .action-btn {
padding: 0.25rem 0.5rem;
font-size: 0.875rem;
border-radius: 0.25rem;
margin-left: 0.25rem;
}
/* Hover эффекты для строк */
.data-table tbody tr {
transition: background-color 0.15s ease;
}
.data-table tbody tr:hover {
background-color: var(--bs-table-hover-bg, rgba(0, 0, 0, 0.02));
}
/* Статус активной сортировки в заголовке */
.data-table th.sorted-asc .sort-icon::before {
content: '\f160';
font-weight: 900;
}
.data-table th.sorted-desc .sort-icon::before {
content: '\f161';
font-weight: 900;
}
/* Анимация появления */
@keyframes data-table-fade-in {
from {
opacity: 0;
transform: translateY(-2px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.data-table .header-search-input {
animation: data-table-fade-in 0.15s ease-in-out;
}
/* Стили для загрузки */
.data-table .loading {
position: relative;
pointer-events: none;
}
.data-table .loading::after {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(255, 255, 255, 0.7);
z-index: 1;
}
/* Пустое состояние */
.data-table .empty-state {
text-align: center;
padding: 3rem 1rem;
color: var(--bs-secondary-color, #6c757d);
}
.data-table .empty-state i {
font-size: 3rem;
opacity: 0.3;
margin-bottom: 1rem;
}
.data-table .empty-state h5 {
margin-bottom: 0.5rem;
}
.data-table .empty-state p {
margin-bottom: 0;
opacity: 0.8;
}
/* Адаптивность для мобильных */
@media (max-width: 768px) {
.data-table .header-content {
gap: 4px;
}
.data-table .header-text {
font-size: 0.875rem;
}
.data-table .search-trigger,
.data-table .sort-icon {
font-size: 0.875rem;
}
.data-table .pagination-wrapper {
flex-wrap: wrap;
justify-content: center;
gap: 0.5rem;
padding: 0.5rem;
}
.data-table .pagination-info,
.data-table .per-page-selector {
flex: 1 1 100%;
justify-content: center;
text-align: center;
}
.data-table .per-page-selector {
justify-content: center;
}
}
/* Исправляем Bootstrap стили для пагинации внутри таблицы */
.table .pagination {
margin-bottom: 0;
}