model-explorer / css /components.css
mr4's picture
Upload 71 files
9bd422a verified
/* Component Styles */
/* Model List Display */
.model-list-item {
display: flex;
align-items: center;
padding: 0.75rem 1rem;
border: 1px solid #dee2e6;
border-radius: 0.375rem;
margin-bottom: 0.5rem;
cursor: pointer;
transition: all 0.2s ease;
background-color: white;
}
.model-list-item:hover {
background-color: #f8f9fa;
border-color: #007bff;
box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);
}
.model-list-item.active {
background-color: #007bff;
border-color: #007bff;
color: white;
}
.model-list-item i {
margin-right: 0.5rem;
}
.model-list-item-name {
flex: 1;
font-weight: 500;
}
.model-list-item-size {
font-size: 0.85rem;
color: #6c757d;
margin-left: 0.5rem;
}
.model-list-item.active .model-list-item-size {
color: rgba(255, 255, 255, 0.7);
}
/* Metadata Display */
.metadata-item {
display: flex;
justify-content: space-between;
padding: 0.5rem 0;
border-bottom: 1px solid #f0f0f0;
}
.metadata-item:last-child {
border-bottom: none;
}
.metadata-label {
font-weight: 600;
color: #333;
min-width: 120px;
}
.metadata-value {
color: #666;
word-break: break-word;
text-align: right;
flex: 1;
margin-left: 1rem;
}
.metadata-value.not-available {
color: #999;
font-style: italic;
}
/* Input/Output Display */
.io-section {
margin-bottom: 1.5rem;
}
.io-section:last-child {
margin-bottom: 0;
}
.io-section-title {
font-weight: 600;
color: #333;
margin-bottom: 0.75rem;
font-size: 0.95rem;
text-transform: uppercase;
letter-spacing: 0.5px;
}
.io-item {
padding: 0.75rem;
background-color: #f8f9fa;
border-left: 3px solid #007bff;
margin-bottom: 0.5rem;
border-radius: 0.25rem;
cursor: pointer;
transition: all 0.2s ease;
}
.io-item:hover {
background-color: #e9ecef;
border-left-color: #0056b3;
}
.io-item.highlighted {
background-color: #fff3cd;
border-left-color: #ffc107;
}
.io-item-name {
font-weight: 600;
color: #333;
margin-bottom: 0.25rem;
}
.io-item-shape {
font-size: 0.85rem;
color: #666;
font-family: 'Courier New', monospace;
}
.io-item-type {
font-size: 0.85rem;
color: #999;
margin-top: 0.25rem;
}
.io-item-description {
font-size: 0.8rem;
color: #666;
margin-top: 0.5rem;
font-style: italic;
}
/* Initializer Display */
.initializer-item {
padding: 0.75rem;
background-color: #f8f9fa;
border-left: 3px solid #28a745;
margin-bottom: 0.5rem;
border-radius: 0.25rem;
cursor: pointer;
transition: all 0.2s ease;
}
.initializer-item:hover {
background-color: #e9ecef;
border-left-color: #1e7e34;
}
.initializer-item.highlighted {
background-color: #d4edda;
border-left-color: #28a745;
}
.initializer-item-name {
font-weight: 600;
color: #333;
margin-bottom: 0.25rem;
}
.initializer-item-info {
font-size: 0.85rem;
color: #666;
font-family: 'Courier New', monospace;
}
.initializer-item-size {
font-size: 0.8rem;
color: #999;
margin-top: 0.25rem;
}
/* File Upload - Drag-and-Drop Visual Feedback */
.drag-over {
outline: 3px dashed #007bff;
outline-offset: -4px;
background-color: rgba(0, 123, 255, 0.04);
}
/* Tensor Item (shared style for input/output tensor entries) */
.tensor-item {
padding: 0.75rem;
background-color: #f8f9fa;
border-left: 3px solid #17a2b8;
margin-bottom: 0.5rem;
border-radius: 0.25rem;
cursor: pointer;
transition: all 0.2s ease;
}
.tensor-item:hover {
background-color: #e9ecef;
border-left-color: #117a8b;
}
.tensor-item:focus {
outline: 2px solid #17a2b8;
outline-offset: 1px;
}
.tensor-item.highlighted {
background-color: #d1ecf1;
border-left-color: #17a2b8;
}
/* Graph Visualization */
#graphContainer {
background-color: white;
border: 1px solid #dee2e6;
border-radius: 0.375rem;
position: relative;
overflow: hidden;
min-height: 220px;
}
.graph-controls {
position: absolute;
bottom: 1rem;
right: 1rem;
display: flex;
gap: 0.5rem;
z-index: 10;
}
.graph-controls button {
padding: 0.5rem 0.75rem;
background-color: white;
border: 1px solid #dee2e6;
border-radius: 0.375rem;
cursor: pointer;
transition: all 0.2s ease;
font-size: 0.85rem;
}
.graph-controls button:hover {
background-color: #f8f9fa;
border-color: #007bff;
}
.graph-controls button:focus {
outline: 2px solid #007bff;
outline-offset: 1px;
}
/* Graph node tooltip */
.graph-node-tooltip {
position: absolute;
background-color: rgba(33, 37, 41, 0.92);
color: #fff;
padding: 0.4rem 0.65rem;
border-radius: 0.3rem;
font-size: 0.8rem;
pointer-events: none;
z-index: 100;
max-width: 240px;
word-break: break-word;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.25);
line-height: 1.4;
}
/* Error Display */
.alert {
border-radius: 0.375rem;
padding: 1rem;
margin-bottom: 1rem;
border: 1px solid transparent;
}
.alert-error {
background-color: #f8d7da;
border-color: #f5c6cb;
color: #721c24;
}
.alert-warning {
background-color: #fff3cd;
border-color: #ffeeba;
color: #856404;
}
.alert-info {
background-color: #d1ecf1;
border-color: #bee5eb;
color: #0c5460;
}
.alert-success {
background-color: #d4edda;
border-color: #c3e6cb;
color: #155724;
}
.alert-close {
float: right;
cursor: pointer;
font-weight: bold;
opacity: 0.7;
transition: opacity 0.2s ease;
}
.alert-close:hover {
opacity: 1;
}
/* Search Filter */
#searchInput {
width: 100%;
padding: 0.75rem;
border: 1px solid #dee2e6;
border-radius: 0.375rem;
font-size: 0.95rem;
}
#searchInput:focus {
outline: none;
border-color: #007bff;
box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
}
.search-results-count {
font-size: 0.85rem;
color: #6c757d;
margin-top: 0.5rem;
}
.no-results {
padding: 2rem 1rem;
text-align: center;
color: #6c757d;
}
.no-results i {
font-size: 2rem;
margin-bottom: 0.5rem;
opacity: 0.5;
}
/* Loading State */
.loading-spinner {
display: inline-block;
width: 1rem;
height: 1rem;
border: 2px solid #f3f3f3;
border-top: 2px solid #007bff;
border-radius: 50%;
animation: spin 1s linear infinite;
}
@keyframes spin {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
/* Badge */
.badge {
display: inline-block;
padding: 0.25rem 0.5rem;
background-color: #007bff;
color: white;
border-radius: 0.25rem;
font-size: 0.75rem;
font-weight: 600;
}
.badge-secondary {
background-color: #6c757d;
}
.badge-success {
background-color: #28a745;
}
.badge-danger {
background-color: #dc3545;
}
/* Tabs */
.nav-tabs {
border-bottom: 2px solid #dee2e6;
margin-bottom: 1rem;
}
.nav-tabs .nav-link {
color: #6c757d;
border: none;
border-bottom: 2px solid transparent;
padding: 0.5rem 1rem;
cursor: pointer;
transition: all 0.2s ease;
}
.nav-tabs .nav-link:hover {
color: #007bff;
border-bottom-color: #007bff;
}
.nav-tabs .nav-link.active {
color: #007bff;
border-bottom-color: #007bff;
font-weight: 600;
}
/* Comparison View */
.comparison-container {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 1rem;
}
.comparison-model {
border: 2px solid #dee2e6;
border-radius: 0.375rem;
padding: 1rem;
}
.comparison-model.model-1 {
border-color: #007bff;
}
.comparison-model.model-2 {
border-color: #28a745;
}
.comparison-difference {
background-color: #fff3cd;
padding: 0.25rem 0.5rem;
border-radius: 0.25rem;
font-weight: 600;
}
/* Model List Item - focus state */
.model-list-item:focus {
outline: 2px solid #007bff;
outline-offset: 1px;
}
/* IO Item - focus state */
.io-item:focus {
outline: 2px solid #007bff;
outline-offset: 1px;
}
/* Initializer Item - focus state */
.initializer-item:focus {
outline: 2px solid #28a745;
outline-offset: 1px;
}
@media (max-width: 768px) {
.comparison-container {
grid-template-columns: 1fr;
}
}
/* Utility */
.cursor-pointer {
cursor: pointer;
}
/* Comparison View */
.comparison-view {
animation: fadeIn 0.2s ease;
}
@keyframes fadeIn {
from { opacity: 0; transform: translateY(4px); }
to { opacity: 1; transform: translateY(0); }
}
.comparison-diff {
background-color: #fff3cd;
border-radius: 3px;
padding: 0 3px;
font-weight: 500;
color: #856404;
}
/* ─── Node Detail Panel ──────────────────────────────────────────────────── */
.node-detail-panel-content {
padding: 0.5rem;
overflow-y: auto;
}
.node-detail-header {
padding-bottom: 0.25rem;
}
.node-detail-section {
margin-bottom: 0.75rem;
}
/* ─── Graph Minimap ──────────────────────────────────────────────────────── */
.graph-minimap-toggle:hover {
opacity: 1 !important;
}
/* ─── Layer Stats ────────────────────────────────────────────────────────── */
.layer-stats-row {
cursor: pointer;
transition: background-color 0.15s ease;
}
.layer-stats-row:hover {
background-color: #e9ecef;
}
/* ─── Recent Models ──────────────────────────────────────────────────────── */
.recent-model-item {
cursor: pointer;
transition: background-color 0.15s ease;
}
.recent-model-item:hover {
background-color: #f0f0f0;
}
.recent-models-clear-btn {
font-size: 0.8rem;
}
/* ─── Graph Export ────────────────────────────────────────────────────────── */
.graph-export-wrapper {
position: relative;
display: inline-block;
}
.graph-export-dropdown {
position: absolute;
top: 100%;
right: 0;
z-index: 20;
background: #fff;
border: 1px solid #dee2e6;
border-radius: 0.375rem;
box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.12);
min-width: 140px;
overflow: hidden;
}
.graph-export-option {
display: block;
width: 100%;
padding: 0.45rem 0.75rem;
border: none;
background: none;
text-align: left;
font-size: 0.85rem;
cursor: pointer;
transition: background-color 0.15s ease;
}
.graph-export-option:hover {
background-color: #f8f9fa;
}
/* ─── Graph Path Highlighting (Cytoscape classes) ────────────────────────── */
/* Applied via cy.addClass(); Cytoscape uses its own style system,
but these classes are available for any DOM-based overlays. */
/* ─── Fullscreen Graph View ──────────────────────────────────────────────── */
.graph-card-fullscreen {
background: #fff;
}
.graph-card-fullscreen #graphContainer {
height: calc(100vh - 60px) !important;
}
.fullscreen-btn {
transition: opacity 0.2s ease;
}
.fullscreen-btn:hover {
opacity: 0.9;
}
/* ─── Sidebar Toggle ─────────────────────────────────────────────────────── */
.col-lg-3.col-md-4 {
transition: width 0.3s ease, max-width 0.3s ease, opacity 0.3s ease, padding 0.3s ease, flex 0.3s ease;
overflow: hidden;
}
.sidebar-hidden {
width: 0 !important;
max-width: 0 !important;
flex: 0 0 0 !important;
padding-left: 0 !important;
padding-right: 0 !important;
opacity: 0;
overflow: hidden;
margin: 0 !important;
}
.sidebar-collapsed {
flex: 0 0 100% !important;
max-width: 100% !important;
}
.sidebar-toggle-btn {
transition: opacity 0.2s ease;
}
.sidebar-toggle-btn:hover {
opacity: 0.9;
}
/* ─── Help Tooltip ────────────────────────────────────────────────────────── */
.help-icon {
display: inline-flex;
align-items: center;
justify-content: center;
width: 20px;
height: 20px;
border-radius: 50%;
background-color: #6c757d;
color: #fff;
font-size: 12px;
font-weight: bold;
cursor: pointer;
margin-left: 8px;
transition: background-color 0.2s;
vertical-align: middle;
line-height: 1;
user-select: none;
}
.help-icon:hover {
background-color: #0d6efd;
}
.help-icon:focus {
outline: 2px solid #0d6efd;
outline-offset: 2px;
}
.help-popup {
position: absolute;
z-index: 1050;
background: #fff;
border: 1px solid #dee2e6;
border-radius: 8px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
max-width: 400px;
min-width: 280px;
animation: fadeIn 0.15s ease;
}
.help-popup-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 10px 14px;
border-bottom: 1px solid #dee2e6;
}
.help-popup-title {
font-weight: 600;
font-size: 14px;
color: #333;
}
.help-popup-close {
background: none;
border: none;
font-size: 20px;
cursor: pointer;
color: #6c757d;
line-height: 1;
padding: 0 4px;
}
.help-popup-close:hover {
color: #333;
}
.help-popup-body {
padding: 14px;
font-size: 13px;
line-height: 1.6;
color: #444;
}
.help-popup-footer {
display: flex;
gap: 6px;
padding: 8px 14px;
border-top: 1px solid #dee2e6;
}
.help-lang-btn {
padding: 3px 10px;
border: 1px solid #dee2e6;
border-radius: 4px;
background: #f8f9fa;
cursor: pointer;
font-size: 12px;
font-weight: 500;
transition: all 0.2s;
color: #333;
}
.help-lang-btn:hover {
background: #e9ecef;
}
.help-lang-btn.active {
background: #0d6efd;
color: #fff;
border-color: #0d6efd;
}
@media (max-width: 768px) {
.help-popup {
max-width: calc(100vw - 20px);
min-width: 240px;
}
}
/* ─── Graph Search ─────────────────────────────────────────────────────────── */
.graph-search-container {
display: flex;
align-items: center;
gap: 8px;
margin-bottom: 8px;
}
.graph-search-input {
flex: 1;
padding: 6px 10px;
border: 1px solid #dee2e6;
border-radius: 4px;
font-size: 13px;
}
.graph-search-input:focus {
outline: none;
border-color: #007bff;
box-shadow: 0 0 0 0.15rem rgba(0, 123, 255, 0.25);
}
.graph-search-nav {
display: flex;
align-items: center;
gap: 4px;
}
.graph-search-nav button {
padding: 4px 8px;
border: 1px solid #dee2e6;
border-radius: 4px;
background: #f8f9fa;
cursor: pointer;
font-size: 12px;
transition: background-color 0.15s ease;
}
.graph-search-nav button:hover {
background-color: #e9ecef;
border-color: #007bff;
}
.graph-search-nav button:focus {
outline: 2px solid #007bff;
outline-offset: 1px;
}
.graph-search-count {
font-size: 12px;
color: #6c757d;
white-space: nowrap;
}
/* ─── Guided Tour ─────────────────────────────────────────────────────────── */
#tourBtn {
white-space: nowrap;
}
#tourBtn:focus {
outline: 2px solid #fff;
outline-offset: 2px;
}
/* ─── Graph Layout Switcher ──────────────────────────────────────────────── */
.layout-switcher-container,
.graph-layout-switcher {
position: relative;
}
.graph-layout-dropdown {
position: absolute;
top: 100%;
right: 0;
z-index: 20;
background: #fff;
border: 1px solid #dee2e6;
border-radius: 0.375rem;
box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.12);
min-width: 160px;
overflow: hidden;
margin-top: 2px;
}
.graph-layout-option {
display: block;
width: 100%;
padding: 0.45rem 0.75rem;
border: none;
background: none;
text-align: left;
font-size: 0.85rem;
cursor: pointer;
transition: background-color 0.15s ease;
}
.graph-layout-option:hover {
background-color: #f8f9fa;
}
.graph-layout-option.active {
background-color: #e9ecef;
font-weight: 600;
color: #0d6efd;
}
.graph-layout-option:focus {
outline: 2px solid #007bff;
outline-offset: -1px;
}
.layout-btn {
padding: 0.45rem 0.75rem;
border: 1px solid #dee2e6;
border-radius: 0.375rem;
background: #f8f9fa;
cursor: pointer;
font-size: 0.85rem;
transition: all 0.15s ease;
}
.layout-btn:hover {
background-color: #e9ecef;
border-color: #007bff;
}
.layout-btn.active {
background-color: #0d6efd;
color: #fff;
border-color: #0d6efd;
}
/* ─── Node Grouping ──────────────────────────────────────────────────────── */
.grouping-toggle-btn,
#nodeGroupingBtn {
transition: all 0.2s ease;
}
.grouping-toggle-btn:hover,
#nodeGroupingBtn:hover {
opacity: 0.9;
}
.grouping-toggle-btn:focus,
#nodeGroupingBtn:focus {
outline: 2px solid #007bff;
outline-offset: 1px;
}
/* ─── Graph Annotation ────────────────────────────────────────────────────── */
.annotation-popup {
background: #fff;
border: 1px solid #dee2e6;
border-radius: 8px;
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.2);
min-width: 280px;
max-width: 360px;
animation: fadeIn 0.15s ease;
overflow: hidden;
}
.annotation-popup-header {
padding: 10px 14px;
font-weight: 600;
font-size: 13px;
color: #333;
border-bottom: 1px solid #dee2e6;
background: #f8f9fa;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.annotation-popup-textarea {
display: block;
width: 100%;
padding: 10px 14px;
border: none;
border-bottom: 1px solid #dee2e6;
font-size: 13px;
line-height: 1.5;
resize: vertical;
min-height: 80px;
box-sizing: border-box;
font-family: inherit;
}
.annotation-popup-textarea:focus {
outline: none;
background: #fefefe;
}
.annotation-popup-buttons {
display: flex;
gap: 6px;
padding: 10px 14px;
justify-content: flex-end;
}
.annotation-btn {
padding: 5px 14px;
border: 1px solid #dee2e6;
border-radius: 4px;
font-size: 12px;
font-weight: 500;
cursor: pointer;
transition: all 0.15s ease;
background: #f8f9fa;
color: #333;
}
.annotation-btn:hover {
background: #e9ecef;
}
.annotation-btn-save {
background: #0d6efd;
color: #fff;
border-color: #0d6efd;
}
.annotation-btn-save:hover {
background: #0b5ed7;
}
.annotation-btn-delete {
background: #dc3545;
color: #fff;
border-color: #dc3545;
}
.annotation-btn-delete:hover {
background: #bb2d3b;
}
.annotation-btn-close {
background: #f8f9fa;
color: #333;
}
.annotation-badge {
display: inline-flex;
align-items: center;
justify-content: center;
width: 18px;
height: 18px;
border-radius: 50%;
background-color: #fd7e14;
color: #fff;
font-size: 10px;
font-weight: bold;
line-height: 1;
pointer-events: none;
}
/* ─── FLOPs Estimator ─────────────────────────────────────────────────────── */
.flops-card {
padding: 0.75rem;
background-color: #f8f9fa;
border: 1px solid #dee2e6;
border-radius: 0.375rem;
}
.flops-total {
font-weight: 700;
color: #0d6efd;
font-size: 1rem;
}
.flops-table {
font-size: 0.85rem;
margin-top: 0.5rem;
}
.flops-table th {
background-color: #e9ecef;
font-weight: 600;
font-size: 0.8rem;
text-transform: uppercase;
letter-spacing: 0.3px;
}
.flops-table td {
vertical-align: middle;
}
/* ─── Language Switcher ───────────────────────────────────────────────────── */
.lang-switcher {
position: relative;
}
.lang-switcher-dropdown {
position: absolute;
top: 100%;
right: 0;
z-index: 1060;
background: #fff;
border: 1px solid #dee2e6;
border-radius: 0.375rem;
box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.15);
min-width: 90px;
overflow: hidden;
margin-top: 4px;
}
.lang-switcher-option {
display: block;
width: 100%;
padding: 0.4rem 0.75rem;
border: none;
background: none;
text-align: left;
font-size: 0.85rem;
cursor: pointer;
transition: background-color 0.15s ease;
color: #333;
}
.lang-switcher-option:hover {
background-color: #f8f9fa;
}
.lang-switcher-option.active {
background-color: #0d6efd;
color: #fff;
font-weight: 600;
}
.lang-switcher-option:focus {
outline: 2px solid #007bff;
outline-offset: -1px;
}
/* ─── SafeTensors Viewer ─────────────────────────────────────────────────── */
/* Panel wrappers */
[data-st-panel] {
animation: fadeIn 0.2s ease;
}
/* Summary card (Req 40) */
[data-st-panel="summary"] .card {
border-left: 4px solid #0d6efd;
}
[data-st-panel="summary"] .card-header {
background-color: #f0f4ff;
}
/* Metadata card (Req 39) */
[data-st-panel="metadata"] .card {
border-left: 4px solid #6f42c1;
}
[data-st-panel="metadata"] .card-header {
background-color: #f5f0ff;
}
[data-st-panel="metadata"] .table td {
vertical-align: top;
word-break: break-word;
}
/* Metadata expand/collapse (Req 39.4) */
.st-meta-truncated,
.st-meta-full {
line-height: 1.6;
}
.st-expand-btn,
.st-collapse-btn {
font-size: 0.8rem;
text-decoration: none;
white-space: nowrap;
}
.st-expand-btn:hover,
.st-collapse-btn:hover {
text-decoration: underline;
}
/* Tensor list card (Req 38) */
[data-st-panel="tensorList"] .card {
border-left: 4px solid #198754;
}
[data-st-panel="tensorList"] .card-header {
background-color: #f0faf4;
}
/* Search input (Req 42.1) */
.st-tensor-search {
transition: border-color 0.2s ease, box-shadow 0.2s ease;
}
.st-tensor-search:focus {
border-color: #198754;
box-shadow: 0 0 0 0.2rem rgba(25, 135, 84, 0.25);
}
/* Sort buttons (Req 41.5) */
.st-sort-name,
.st-sort-size {
transition: all 0.15s ease;
white-space: nowrap;
}
.st-sort-name.btn-secondary,
.st-sort-size.btn-secondary {
color: #fff;
}
/* Tensor count display */
.st-tensor-count {
font-size: 0.85rem;
}
/* Tensor table wrapper - responsive horizontal scroll on mobile */
.st-tensor-table-wrapper {
-webkit-overflow-scrolling: touch;
}
.st-tensor-table-wrapper .table {
min-width: 500px;
}
.st-tensor-table-wrapper thead th {
font-size: 0.8rem;
text-transform: uppercase;
letter-spacing: 0.3px;
white-space: nowrap;
}
.st-tensor-table-wrapper tbody td {
vertical-align: middle;
font-size: 0.875rem;
}
.st-tensor-table-wrapper tbody tr {
transition: background-color 0.1s ease;
}
/* Dtype badge colors (Req 38.6) - enhance inline badge styles */
[data-st-panel="tensorList"] .badge {
font-size: 0.75rem;
font-weight: 600;
letter-spacing: 0.3px;
min-width: 36px;
text-align: center;
}
/* Responsive: tensor table horizontal scroll on mobile */
@media (max-width: 768px) {
.st-tensor-table-wrapper {
overflow-x: auto;
-webkit-overflow-scrolling: touch;
max-height: 400px;
}
[data-st-panel="summary"] .row .col-md-3 {
border-bottom: 1px solid #eee;
padding-bottom: 0.5rem;
}
[data-st-panel="summary"] .row .col-md-3:last-child {
border-bottom: none;
}
}