UNPKG

modern-table-js

Version:

Modern, lightweight, vanilla JavaScript table library with zero dependencies. 67% faster than DataTables with mobile-first responsive design.

414 lines (352 loc) 8.5 kB
/** * ModernTable.js - Responsive CSS * Mobile-first responsive design for pagination and toolbar */ /* Desktop pagination - prevent wrapping */ @media (min-width: 769px) { .pagination { flex-wrap: nowrap; overflow-x: auto; gap: 0; } .page-link { white-space: nowrap; min-width: auto; padding: 6px 8px; font-size: 14px; } } /* Hide First/Last on medium desktop to prevent wrapping */ @media (min-width: 769px) and (max-width: 1200px) { .page-item.page-first, .page-item.page-last { display: none; } } /* Tablet adjustments */ @media (max-width: 992px) { .toolbar-right { min-width: 200px; } .modern-table-search { max-width: 200px; } .modern-table-filters { gap: 8px; } .modern-table-filters > div { min-width: 100px; flex: 1 1 calc(33.333% - 8px); } } /* Mobile pagination and toolbar optimizations */ @media (max-width: 768px) { /* Compact table layout for mobile */ .modern-table-wrapper table { font-size: 12px !important; line-height: 1.3 !important; } .modern-table-wrapper th, .modern-table-wrapper td { padding: 4px 6px !important; vertical-align: middle !important; } .modern-table-wrapper .column-search-row th { padding: 2px 4px !important; } .modern-table-wrapper .column-search-input { font-size: 11px !important; padding: 2px 4px !important; height: auto !important; min-height: 24px !important; } .modern-table-wrapper .badge { font-size: 10px !important; padding: 2px 6px !important; } .modern-table-wrapper .btn-group-sm .btn { font-size: 10px !important; padding: 2px 4px !important; } /* Compact footer for mobile */ .modern-table-wrapper tfoot th, .modern-table-wrapper tfoot td { padding: 4px 6px !important; font-size: 11px !important; line-height: 1.2 !important; } /* Footer responsive behavior */ .modern-table-wrapper tfoot th[colspan] { text-align: center !important; font-size: 10px !important; white-space: nowrap !important; overflow: hidden !important; text-overflow: ellipsis !important; } /* Toolbar responsive */ .modern-table-toolbar { flex-direction: column; align-items: stretch; gap: 0.75rem; } .toolbar-left, .toolbar-center, .toolbar-right { flex: none; min-width: auto; justify-content: center; } .toolbar-right { order: -1; /* Search first on mobile */ } .modern-table-search { max-width: none; } /* Stack buttons vertically on very small screens */ .toolbar-center { flex-wrap: wrap; gap: 0.5rem; } .toolbar-center .btn { flex: 1; min-width: calc(50% - 0.25rem); margin: 0; } /* Pagination responsive */ .pagination { gap: 1px; flex-wrap: nowrap; justify-content: center; overflow-x: auto; } .page-link { padding: 8px 6px; font-size: 13px; min-width: 36px; margin-left: 0; border-radius: 4px; white-space: nowrap; } /* Hide First/Last buttons on mobile */ .page-item.page-first, .page-item.page-last { display: none; } /* Pagination info */ .modern-table-pagination { flex-direction: column; gap: 1rem; text-align: center; } .modern-table-info { font-size: 12px; order: 2; } /* Pagination controls first on mobile */ .modern-table-pagination nav { order: 1; } /* Filters responsive */ .modern-table-filters { flex-direction: column; align-items: stretch; gap: 12px; } .modern-table-filters > div { min-width: auto; flex: none; } } /* Very small screens */ @media (max-width: 480px) { /* Compact pagination */ body:not(.bootstrap-loaded) .page-link { padding: 8px 6px; font-size: 12px; min-width: 36px; } /* Show only essential pagination on very small screens */ body:not(.bootstrap-loaded) .pagination-mobile-minimal .page-item:not(.page-prev):not(.page-next):not(.active) { display: none; } /* Compact filters */ .modern-table-filters { padding: 12px; } /* Smaller buttons */ .toolbar-center .btn { font-size: 12px; padding: 6px 8px; } } /* Landscape phone adjustments */ @media (max-width: 768px) and (orientation: landscape) { .modern-table-toolbar { flex-direction: row; flex-wrap: wrap; } .toolbar-right { order: 0; } } /* Responsive expand button and detail rows */ .expand-btn { width: 18px; height: 18px; margin-left: 8px; padding: 0; border: none; border-radius: 50%; background: var(--bs-primary, #007bff); color: white; font-size: 10px; font-weight: 600; line-height: 1; cursor: pointer; display: inline-flex; align-items: center; justify-content: center; transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1); box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12); } .expand-btn:hover { background: var(--bs-primary, #007bff); transform: scale(1.15); box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2); } .expand-btn:active { transform: scale(0.9); transition-duration: 0.1s; } .dtr-expanded .expand-btn { background: #dc3545; } .dtr-expanded .expand-btn:hover { background: #c82333; } /* Detail rows - Desktop */ .dtr-details { background-color: #f8f9fa !important; height: auto !important; min-height: 40px !important; max-height: 80px !important; } .dtr-details-content { padding: 6px !important; border-top: 1px solid #dee2e6; width: 1px !important; max-width: 1px !important; overflow: hidden !important; box-sizing: border-box !important; word-wrap: break-word !important; overflow-wrap: break-word !important; font-size: 11px !important; line-height: 1.2 !important; } .dtr-details-list { margin: 0 !important; padding: 0 !important; display: grid !important; grid-template-columns: minmax(0, 60px) minmax(0, 1fr) !important; gap: 3px 6px !important; align-items: start !important; width: 100% !important; max-width: 100% !important; overflow: hidden !important; } .dtr-details-list dt { font-weight: 600 !important; color: #495057 !important; margin: 0 !important; padding: 1px 0 !important; border-bottom: 1px solid #e9ecef !important; white-space: nowrap !important; overflow: hidden !important; text-overflow: ellipsis !important; max-width: 60px !important; min-width: 0 !important; font-size: 9px !important; } .dtr-details-list dd { margin: 0 !important; padding: 1px 0 !important; border-bottom: 1px solid #e9ecef !important; word-break: break-word !important; overflow-wrap: break-word !important; overflow: hidden !important; min-width: 0 !important; font-size: 10px !important; line-height: 1.1 !important; } /* Detail rows - Mobile extra compact */ @media (max-width: 768px) { .dtr-details { min-height: 30px !important; max-height: 60px !important; } .dtr-details-content { padding: 4px !important; font-size: 10px !important; line-height: 1.1 !important; } .dtr-details-list { gap: 2px 4px !important; grid-template-columns: minmax(0, 50px) minmax(0, 1fr) !important; } .dtr-details-list dt { font-size: 8px !important; padding: 1px 0 !important; max-width: 50px !important; } .dtr-details-list dd { font-size: 9px !important; padding: 1px 0 !important; line-height: 1.0 !important; } /* Extra compact badges and buttons in detail */ .dtr-details-list .badge { font-size: 8px !important; padding: 1px 3px !important; } .dtr-details-list .btn { font-size: 8px !important; padding: 1px 2px !important; } } /* Dark theme support for responsive */ [data-bs-theme="dark"] .dtr-details { background-color: #343a40 !important; } [data-bs-theme="dark"] .dtr-details-content { border-top-color: #495057; } [data-bs-theme="dark"] .dtr-details-list dt { color: #adb5bd; border-bottom-color: #495057; } [data-bs-theme="dark"] .dtr-details-list dd { border-bottom-color: #495057; } [data-bs-theme="dark"] .dtr-control:hover { background-color: rgba(255, 255, 255, 0.1) !important; } /* Print styles */ @media print { .modern-table-toolbar, .modern-table-pagination { display: none; } .modern-table { font-size: 12px; } .modern-table th, .modern-table td { padding: 4px 6px; } .expand-btn { display: none !important; } .dtr-details { display: none !important; } }